ИЗМЕНИТЬ
Я просто хочу вызвать исключение, когда я делаю 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]: {}
Есть более удобный способ?
attrs
из своего методаvalidate
? Не могли бы вы поделиться дополнительным кодом вашего класса сериализатора и моделиUser
? - person Devang Padhiyar   schedule 02.04.2019validate
даже не вызывается. Я думал, что он вызывается автоматически при сериализации модели. Больше ничего нет. Предположим, что пользовательская модель содержит эти поля или в сериализаторе есть методы, которые их извлекают. - person Milano   schedule 02.04.2019is_valid()
вашего сериализатора? - person Devang Padhiyar   schedule 02.04.2019b.errors
в вашем случае. - person M.Fooladgar   schedule 02.04.2019