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