字段在Django DRF中的OneToOne字段上必须是唯一的

问题描述 投票:0回答:1

我正在使用Django 2.x和DRF。

我有一个模型来保存每个实体的评级

class UserRideRating(models.Model):
    user_ride = models.OneToOneField(UserRide, on_delete=models.CASCADE, related_name='user_ride_rating')
    rating = models.PositiveIntegerField(
        validators=[validate_rating_range]
    )

和serializers.py

class UserRideRatingSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserRideRating
        fields = ('id', 'user_ride', 'rating')

我有一个视图来创建评级对象(如果尚未存在)或更新评级(如果已存在)。此外,我想使用默认的Serializer验证检查验证,因此我的观点是

@api_view(['POST'])
def rate(request):
    serializer = UserRideRatingSerializer(data=request.data)

    if serializer.is_valid(raise_exception=True):
        # create or update data
        return Response(serializer.data)

当从邮递员传递数据时,它会给出错误

{
    "user_ride": [
        "This field must be unique."
    ]
}

如何启用仅检查有效数据而不检查字段的唯一性?虽然user_ride应该是唯一的,但它可以传递请求数据。

django django-models django-rest-framework django-serializer
1个回答
1
投票

如果要跳过此唯一检查,则必须为序列化程序提供UserRideRating的现有实例。

由于您没有为序列化程序提供实例,因此它正在考虑您创建一个具有相同UserRide id的新序列化程序。

使用此代码:

@api_view(['POST'])
def rate(request):
    user_ride_id = request.data.get('user_ride')
    try:
        instance = UserRideRating.objects.get(user_ride_id=user_ride_id)
    except UserRideRating.DoesNotExist:
        instance=None
    serializer = UserRideRatingSerializer(instance, data=request.data)

    if serializer.is_valid(raise_exception=True):
        # create or update data
        return Response(serializer.data)
© www.soinside.com 2019 - 2024. All rights reserved.