Django Сериализаторы Rest Framework проверяют проходы для одного, но не на другом - PullRequest
0 голосов
/ 13 марта 2020

Вот что у меня сейчас есть:

models.py:

class Team(models.Model):
    label = models.CharField(max_length=128, unique=True)

    def __str__(self) -> str:
        return self.label


class AppName(models.Model):
    label = models.CharField(max_length=128, unique=True)

    def __str__(self) -> str:
        return self.label

serializers.py

class TeamSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Team
        fields = [
            'id',
            'label'
        ]
class AppNameSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = AppName
        fields = [
            'id',
            'label'
        ]

Это моя функция:

    appname = AppNameSerializer(data={'label': request.POST.get('appname')})
    if appname.is_valid():
        appname = appname.save()

    team = TeamSerializer(data={'label': request.POST.get('team')})
    if team.is_valid():
        team = team.save()

, где request.POST.get ('appname') - это 'foo-name', а request.POST.get ('team') - это 'Chocobo Knights'

Почему appname.is_valid () бросать недействительным? тогда как team.is_valid () проходит? Это фактически один и тот же код, я так запутался.

TeamSerializer(data={'label': 'Chocobo Knights'}):
    id = IntegerField(label='ID', read_only=True)
    label = CharField(max_length=128, validators=[<UniqueValidator(queryset=Team.objects.all())>]) True
AppNameSerializer(data={'label': 'foo-app'}):
    id = IntegerField(label='ID', read_only=True)
    label = CharField(max_length=128, validators=[<UniqueValidator(queryset=AppName.objects.all())>]) False

Является ли это правильным подходом с учетом уникального валидатора БД?

    appname = AppNameSerializer(data={'label': request.POST.get('appname')})
    if appname.is_valid():
        appname = appname.save()
    else:
        appname = AppName.objects.get(**appname.data)

    team = TeamSerializer(data={'label': request.POST.get('team')})
    if team.is_valid():
        team = team.save()
    else:
        team = Team.objects.get(**team.data)

1 Ответ

1 голос
/ 13 марта 2020

Проверка вашего сериализатора зависит от состояния базы данных.

Код может быть таким же, но если в таблице Team уже есть «Chocobo Knights», а в AppName нет «foo-app» ... не ожидайте одинаковых результатов для обоих!

...