Как переопределить проверку поля модели в фреймворке django rest ModelSerializer

У меня есть следующая модель:

class UserProfile(models.Model):
    mobileNumber = models.BigIntegerField(primary_key=True)
    authKey = models.CharField(max_length=300,null=False,blank=False)
    creationDateTime = models.DateTimeField(auto_now_add=True)
    lastUpdateDateTime = models.DateTimeField(auto_now=True)

Сериализатор:

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('mobileNumber','authKey')

Если модель профиля пользователя уже имеет мобильный номер XX44 и если я попытаюсь сериализовать с помощью UserProfileSerializer с json {'mobileNumber': XX44, 'authKey': u'ggsdsagldaslhdkjashdjkashdjkahsdkjah'}, я получаю следующую ошибку:

{'mobileNumber': [u'User profile with this MobileNumber already exists.']}

потому что проверки модели выполняются для поля сериализатора.

Как я могу остановить выполнение проверки поля модели для mobileNumber. Я пробовал методы validate и validate_mobileNumber в сериализаторе, но они все еще выполняют проверки модели.


person Rahul Attuluri    schedule 25.03.2014    source источник
comment
Данные, которые вы пытаетесь сериализовать {'mobileNumber':XX44.....} Это какие-то случайные данные или данные модели UserProfile? Потому что, если это случайные непроверенные данные, вам не следует использовать сериализатор модели для их сериализации, просто используйте обычный сериализатор.   -  person zaphod100.10    schedule 25.03.2014
comment
Попробуйте удалить «primary_key=True» из модели профиля пользователя.   -  person CuriousGeorge    schedule 26.08.2015


Ответы (3)


удалите уникальное ограничение на мобильный номер таблицы, поэтому сериализатор django будет проверять в соответствии с этим.

или альтернативно,

   serializer=UserProfileSerializer(data=request.DATA,partial=True)
person user3635290    schedule 14.05.2014

Я понимаю, что вы не сохраните данные сериализатора. Итак, вы можете установить mobileNumber как поле read_only на UserProfileSerializer.

Дополнительные сведения см. в документации по полям сериализатора: http://www.django-rest-framework.org/api-guide/fields/#core-arguments

person Danilo Freitas    schedule 05.01.2016

Переопределив поле модели в сериализаторе и указав required=False, allow_blank=True, allow_null=True:

class SomeModel(models.Model):
   some_model_field_which_is_required = models.ForeignKey(...)
   some_other_required_field = models.CharField(...)

class SomeModelSerializer(serializers.ModelSerializer):
    some_model_field_which_is_required = SomeNestedSerializer(
        many=True, required=False, allow_blank=True
    )
    some_other_required_field = serializers.CharField(required=False, allow_blank=True)

   def validate(self, *args, **kwargs):
       print('should get here')

   def validate_some_other_required_field(self, *args, **kwargs):
       print('should also get here')

    class Meta:
        model = SomeModel

person jmunsch    schedule 01.10.2019