Django Rest Framework - определите обязательные поля - PullRequest
0 голосов
/ 02 апреля 2019

РЕДАКТИРОВАТЬ

Я просто хочу вызвать исключение, когда я делаю BrokerSerializer(user).data, и любое из значений None

Я использую DRF для сериализации объектовчтобы экспортировать их через API, я не использую его для создания объектов.

Ищу самый простой способ сделать поля обязательными при сериализации модели.

API требует, чтобы некоторые поля были не нулевыми, поэтому я хочу увеличить APIMissingDataException, если какое-либо из них имеет значение null / None.

Я пытался:

class BrokerSerializer(serializers.ModelSerializer):
    import_id = serializers.IntegerField(source='pk')
    deleted = serializers.SerializerMethodField()
    full_name = serializers.CharField(source='userprofile.get_display_name')
    phone_work = serializers.CharField(source='userprofile.contact_information.telephone')
    email_work = serializers.CharField(source='userprofile.contact_information.email')

class Meta:
    model = User
    fields = ['import_id', 'deleted', 'full_name', 'phone_work', 'email_work']
    required_fields = fields


def validate(self, attrs):
    super().validate(attrs)
    if not all([attrs.get(fieldname) for fieldname in self.Meta.required_fields]):
        raise APIMissingDataException()
    return attrs

def get_deleted(self, obj):
    return 0

Но функция validate по какой-то причине не вызывается.Я не хочу явно определять все поля, просто чтобы добавить к ним required=False параметров.

In [10]: b = BrokerSerializer(User.objects.first())                                                                                                                                                  

In [11]: b.data                                                                                                                                                                                       

# It should have raised exception since there are None
Out[11]: {'import_id': 1, 'deleted': 0, 'full_name': None, 'phone_work': None, 'email_work': None}

In [12]: b = BrokerSerializer(data=User.objects.first())                                                                                                                                             

In [13]: b.is_valid()                                                                                                                                                                                
Out[13]: False

In [14]: b.data                                                                                                                                                                                      
Out[14]: {}

Есть ли более удобный способ?

Ответы [ 2 ]

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

Надеюсь этот ответ также применим здесь:)

Основная информация
Процесс проверки проходит только тогда, когда Deserialization процесс (входные данные - dict подобный объект), и вы пытаетесь Serialization процесс . В случае Serialization DRF предполагает, что данный объект является допустимым и, следовательно, он не требует проверки.

0 голосов
/ 02 апреля 2019

DRF имеет встроенные методы для обработки.

name = serializers.CharField(label="name field",required=True, allow_blank=False, allow_null=False)

Затем используйте serializer.is_valid() для проверки данных.

Подробнее см. this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...