django rest框架-外键字段是只读的

时间:2019-03-27 09:11:42

标签: 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 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”,因为我确实喜欢这样命名它们,并且仍然获得默认的验证和保存行为?最好不要向串行器添加太多代码。

1 个答案:

答案 0 :(得分:1)

company_id是一个只读字段,因为它在模型中缺少适当的定义,无法让序列化程序理解它。 使它工作的步骤:

  1. 添加显式字段定义
  2. 添加约束

序列化器为:

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')
            )
        ]