«Это поле обязательно», когда поле GenericRelation помечено как необязательное в сериализаторе

#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 для этого поля игнорируются.