Python django rest框架-外键字段为只读
模型:Python django rest框架-外键字段为只读,python,django,django-rest-framework,Python,Django,Django Rest Framework,模型: class Item(models.Model): company = models.ForeignKey(Company, on_delete=models.CASCADE) item_num = models.IntegerField() # other fields... class Meta: unique_together = [('company', 'item_num') ] 序列化程序: class ItemSerializ
class Item(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
item_num = models.IntegerField()
# other fields...
class Meta:
unique_together = [('company', 'item_num') ]
序列化程序:
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ('company_id', 'item_num', )
问题是django rest framework为公司id
字段生成了一个ReadOnlyField()
,因此当我在视图代码中创建一个新实例时,该字段是不可编辑的,如下所示:
s = ItemSerializer(data=request.POST)
s.save()
我还丢失了模型中定义的默认UniqueTogetherValidator
。
不过,如果我将序列化程序字段名从“company_id”更改为“company”,我会得到验证器,因为drf将生成PrimaryKeyRelatedField
,因此它将是可编辑的
我如何仍然将外键对象命名为“company_id”,因为我更喜欢这样命名,并且仍然可以获得默认的验证和保存行为?最好不向序列化程序添加太多代码
company\u id
是一个只读字段,因为它在模型中缺少合适的定义,序列化程序无法理解它。
使其工作的步骤:
class ItemSerializer(serializers.ModelSerializer):
company_id = serializers.PrimaryKeyRelatedField(source=company, queryset=Company.objects.all())
class Meta:
model = Item
fields = ('company_id', 'item_num', )
validators = [
UniqueTogetherValidator(
queryset=Item.objects.all(),
fields=('company_id', 'item_num')
)
]
我是否应该使用
company\u id=serializers.PrimaryKeyRelatedField()
而不是IntegerField()?不重新定义模型验证就可以这样做吗?我的错,你是对的,它应该是PrimaryKeyRelatedField
如果你保留名称company
而不是company\u id