首页 > 解决方案 > Django rest 框架 - 使用 2 种不同类型的序列化程序的多对一关系?

问题描述

我有一个用户序列化程序。用户与公司具有多对一关系。

class CompanySerializer(serializers.ModelSerializer):
    class Meta:
        model = Company
        fields = "__all__"

class UserSerializer(serializers.ModelSerializer):
    company = CompanySerializer(many=False, read_only=True)

    class Meta:
        model = User
        fields = [...fields..., "company"]

get 请求将返回 json,如:

{
   "username" : "...",
   ...other fields...,
   company: {
      ...company fields...
   }
}

公司不能为空。用户总是有一家公司。

当我尝试通过发送如下 json 来创建用户时:

{
   "username" : "...",
   ...other fields...,
   company: 1
}

我想这会将用户与公司 1 联系起来,但它告诉我:null value in column "company_id" violates not-null constraint. 是否可以在获取请求中包含模型,但使用主键创建用户?

我需要两个单独的序列化器吗?

标签: pythondjango-rest-framework

解决方案


由于您已将公司设置为只读字段,因此它将不接受任何值,因为该公司值为空。

您的要求是在字段值中需要一个 int 值并返回对象,DRF 没有提供这样的字段,但是您可以创建一个自定义字段,它将接受 int 并返回 dict 对象

class CustomForeignKeyField(serializers.PrimaryKeyRelatedField):
    def get_queryset(self):
        return self.queryset

    def to_representation(self, value):
        value = super().to_representation(value)
        company = Company.objects.get(pk=value)
        return CompanySerializer(user).data
class UserSerializer(serializers.ModelSerializer):
    company = CustomForeignKeyField(querset=Company.objects.all())

    class Meta:
        model = User
        fields = [...fields..., "company"]

推荐阅读