模型:
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框架会为ReadOnlyField()
字段生成一个company_id
,因此当我在如下视图代码中创建新实例时,该字段不可编辑:
s = ItemSerializer(data=request.POST)
s.save()
我也丢失了模型中定义的默认UniqueTogetherValidator
。
不过,如果我将序列化程序的字段名称从'company_id'更改为'company',则会得到验证器,因为drf会生成PrimaryKeyRelatedField
,因此它是可编辑的。
如何仍然将外键对象命名为“ company_id”,因为我确实喜欢这样命名它们,并且仍然获得默认的验证和保存行为?最好不要向串行器添加太多代码。
答案 0 :(得分:1)
company_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')
)
]