在序列化程序中将GenericRelation字段标记为不需要时,“此字段是必需的”

时间:2019-04-10 19:22:14

标签: 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 = []

正如您所看到的,我对验证规则有些过分了,但是所有人都必须确保它不会强制要求'tags'字段。

但是,POST路由似乎仍返回以下验证消息:

HTTP 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "tags": [
        "This field is required."
    ]
}

我不确定该怎么做,我遵循了Django Rest Framework page about Validators上的文档-我敢肯定这可能是因为它是GenericRelation字段而不是普通字段,但是我我不确定如何解决。你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

想通了。

似乎序列化程序设置可以同时使用-GET和POST。除了我已经在序列化程序上提供的验证选项之外,我还需要指定TaggableTagSerializer的包含是可选的-不管验证如何,整个相关序列化器的包含都应标记为可选。

我需要更改这一行:

tags = TaggableTagSerializer(many=True)

对此:

tags = TaggableTagSerializer(many=True, required=False)