use*_*803 4 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') ]
Run Code Online (Sandbox Code Playgroud)
序列化器:
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ('company_id', 'item_num', )
Run Code Online (Sandbox Code Playgroud)
问题是 django Rest 框架ReadOnlyField()
为该company_id
字段生成一个 ,因此当我在视图代码中创建一个新实例时,该字段不可编辑,如下所示:
s = ItemSerializer(data=request.POST)
s.save()
Run Code Online (Sandbox Code Playgroud)
UniqueTogetherValidator
我还丢失了模型中定义的默认值。不过,如果我将序列化器字段名称从“company_id”更改为“company”,我确实会得到验证器,因为 drf 将生成,PrimaryKeyRelatedField
因此它将是可编辑的。
我如何仍然将外键对象命名为“company_id”,因为我更喜欢这样命名它们,并且仍然获得默认的验证和保存行为?最好不要向序列化器添加太多代码。
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')
)
]
Run Code Online (Sandbox Code Playgroud)