поле должно быть уникальным для поля OneToOne в Django DRF - PullRequest
0 голосов
/ 19 апреля 2019

Я использую 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 должен быть уникальным, он может передавать данные запроса.

1 Ответ

1 голос
/ 20 апреля 2019

Вы должны предоставить сериализатору существующий экземпляр UserRideRating, если хотите пропустить эту уникальную проверку.

Поскольку вы не предоставляете сериализатору экземпляр, он рассматривает возможность создания нового с тем же идентификатором UserRide.

Используйте этот код:

@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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...