我正在DRF中开发一个API,并且偶然发现了一个问题,希望您能帮助我解决这个问题。让我们假设我有以下模型和序列化程序:
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来覆盖它,这是可行的,但对我的用例来说太长了。您知道为什么会发生这种情况吗?我怎样才能修改每个子类中的要求?谢谢。
发布于 2022-05-16 11:16:55
我在DRF文件中找到了答案。我没有提到序列化程序有一些手动声明的字段,这是DRF文档中的原因:
请记住,如果字段已在序列化程序类上显式声明,则extra_kwargs选项将被忽略.
发布于 2022-05-13 12:56:47
我想你不需要上传外键对象。最好添加外键字段,如property_id或address_id,而不是直接使用这些对象。
因此,您可以在序列化程序类中定义该字段。
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},
}https://stackoverflow.com/questions/72229874
复制相似问题