python - 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
. 是否可以在获取请求中包含模型,但使用主键创建用户?
我需要两个单独的序列化器吗?
解决方案
由于您已将公司设置为只读字段,因此它将不接受任何值,因为该公司值为空。
您的要求是在字段值中需要一个 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"]
推荐阅读
- scala - 读取镶木地板文件时无法解析带有 int 和 double 的 Merge Schema
- ios - iOS itms-service 不工作,无法通过 safari 安装应用程序
- selenium - Jenkins中的Selenium文件下载测试用例
- php - 如何根据在 MULTISELECT 上选择的数据在 codeigniter 中循环 OR WHERE
- reactjs - Accordion 组件在 React Native 中单击特定项目时会打开整个项目
- java - 如何修复“尝试在 java.io.StringReader 的空对象引用上调用虚拟方法'int java.lang.String.length()'”?
- c# - C# + Azure 存储 blob:StorageException:当前有一个挂起的复制操作
- prometheus - 如何触发 Prometheus 从日志文件中重新抓取和存储时间序列数据?
- kotlin - 如何在 Kotlin 中更改参数中的对值
- angular - 如何从角度 7 中的任何 IP 地址获得响应