djangorest框架-外键字段是只读的

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

Lin*_*via 5

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')
            )
        ]
Run Code Online (Sandbox Code Playgroud)