Django валидатор REST. У нескольких пользователей могут быть записи с одинаковым значением, но эта запись уникальна для каждого пользователя, как это сделать? - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь выполнить sh следующее с помощью Django REST framework. У меня есть модель Records, в которой есть поле. У него есть внешний ключ для пользователя. Каждый пользователь может создать несколько записей с разными номерами, но не может создать для себя более одной записи с одинаковым номером. Однако каждый другой пользователь может создать для себя запись с тем же номером. Например, пользователи Джо и Джилл. Джо может создать запись с номером 123 только один раз, если он попытается сделать другую запись с номером 123, ему не должно быть позволено. Однако Джилл может создать 123 для себя один раз, но не разрешено больше. пользователь внутри свойства валидатора, или как я могу sh это сделать иначе?

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Вы должны добавить ограничение как на уровне сериализатора, так и на уровне модели на тот случай, если запись будет создана вне сериализатора. Допустим, у записи есть поля id и owner, добавьте свойство unique_together в класс Meta модели:

class Meta:
    unique_together = (('id', 'owner'))

Затем в сериализаторе вы можете использовать CurrentUserDefault расширенное поле для захвата вошедшего в систему пользователя.

from rest_framework.validators import UniqueTogetherValidator


class RecordSerializer(serializer.ModelSerializer):
    owner = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        validators = [
            UniqueTogetherValidator(
                queryset=Record.objects.all(),
                fields=['id', 'owner']
            )
        ]

Конечно, сериализатор должен использоваться в представлении, требующем аутентификации

1 голос
/ 25 мая 2020

На вашей модели Meta установите unique_toght https://docs.djangoproject.com/en/3.0/ref/models/options/#unique -to together

...