#django #django-rest-framework
#django #django-rest-framework
Вопрос:
У меня есть модель, настроенная с именем tags
GenericRelation . Объект GenericRelation по умолчанию blank
присваивает атрибуту kwargs значение True, поэтому на уровне модели допускается значение null:
class Character(models.Model):
name = models.CharField(max_length=200)
date_of_birth = models.DateField()
tags = GenericRelation(TaggableTag, content_type_field='taggable_type', object_id_field='taggable_id')
В сериализаторе я прикрепил сериализатор к этому полю тегов, чтобы убедиться, что он загружается при каждом запросе информации о символах.
class CharacterSerializer(serializers.HyperlinkedModelSerializer):
tags = TaggableTagSerializer(many=True)
class Meta:
model = Character
fields = ('id', 'name', 'date_of_birth', 'tags')
extra_kwargs = {
'tags': {'required': False, 'allow_null': True, 'default': None}
}
validators = []
Как вы можете видеть, я немного переборщил с правилами проверки, но все для того, чтобы быть вдвойне уверенным, что это не делает поле «теги» обязательным.
Однако маршрут POST, похоже, по-прежнему возвращает следующее сообщение проверки:
HTTP 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"tags": [
"This field is required."
]
}
Я не уверен, что здесь делать, я следил за документацией на странице Django Rest Framework о валидаторах — я уверен, что это может быть связано с тем, что это поле GenericRelation, а не обычное поле, но я не уверен, как это решить. Можете ли вы помочь?
Ответ №1:
Понял это.
Кажется, настройки сериализатора работают в обоих направлениях — GET и POST. Помимо параметров проверки, которые я уже предоставил в сериализаторе, мне также нужно было указать, что включение TaggableTagSerializer было необязательным — независимо от проверки, включение всего связанного сериализатора должно быть помечено как необязательное.
Мне нужно было изменить эту строку:
tags = TaggableTagSerializer(many=True)
к этому:
tags = TaggableTagSerializer(many=True, required=False)
Комментарии:
1. Я думаю, что здесь дело обстоит немного иначе. Обычно, если вы не указали определение поля явно, указание поля как требуемого: False в extra_kwargs будет работать, но когда вы объявляете поле явно, extra_kwargs для этого поля игнорируются.