首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DRF ModelSerializer元extra_kwargs不适用于相关领域

问DRF ModelSerializer元extra_kwargs不适用于相关领域
EN

Stack Overflow用户
提问于 2022-05-13 12:48:03
回答 2查看 213关注 0票数 1

我正在DRF中开发一个API,并且偶然发现了一个问题,希望您能帮助我解决这个问题。让我们假设我有以下模型和序列化程序:

代码语言:javascript
复制
class SomeModelBase(models.Model):
    property = models.ForeignKey(
        Property,
        on_delete=models.PROTECT,
    )
    name = models.CharField()
    address = models.OneToOneField(null=True, blank=True)

class SomeModel(SomeModelBase):
    ...more fields


class SomeModelBaseSerializer(serializers.ModelSerializer):
    
    
    class Meta:
        fields = "__all__"
        model = SomeModelBase
        extra_kwargs = {"address": {"required": True},}


class SomeModelSerializer(SomeModelBaseSerializer):

    class Meta:
        model = SomeModel
        fields = "__all__""
        extra_kwargs = {
            "name": {"required": True},
            "address": {"required": False},
        }

如您所见,我正在尝试使用extra_kwargs添加字段kwargs。问题是它不适用于相关字段,例如属性或地址字段。我知道我可以通过手动定义一个字段并传递required=True来覆盖它,这是可行的,但对我的用例来说太长了。您知道为什么会发生这种情况吗?我怎样才能修改每个子类中的要求?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-05-16 11:16:55

我在DRF文件中找到了答案。我没有提到序列化程序有一些手动声明的字段,这是DRF文档中的原因:

请记住,如果字段已在序列化程序类上显式声明,则extra_kwargs选项将被忽略.

票数 1
EN

Stack Overflow用户

发布于 2022-05-13 12:56:47

我想你不需要上传外键对象。最好添加外键字段,如property_id或address_id,而不是直接使用这些对象。

因此,您可以在序列化程序类中定义该字段。

代码语言:javascript
复制
class SomeModelSerializer(serializer.ModelSerializer):
    property_id = serializers.IntegerField(write_only=True, required=True)
    address_id = serializers.IntegerField(write_only=True, required=True)
    
    class Meta:
        model = SomeModel
        fields = "__all__"
        extra_kwargs = {
            "name": {"required": True},
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72229874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档