django - Django OneToOne 关系 - 如何序列化它?
问题描述
简单的示例学生和员工类,我想像下面这样序列化它,它应该是 OneToOne 关系:
{
"college": "string",
"year": "string",
"is_with_college": true,
"employee": {
"full_name": "string",
"email_id": "user@example.com",
"mobile_no": "string",
"is_job_ready": true,
"type": "string",
"location_preference": "string"
}
}
楷模:
class Employee(models.Model):
full_name=models.CharField(max_length=100)
email_id=models.EmailField(max_length=100)
mobile_no=models.CharField(max_length=11)
is_job_ready=models.BooleanField(False)
type=models.CharField(max_length=20)
location_preference=models.CharField(max_length=20)
class Student(models.Model):
college=models.CharField(max_length=100)
year=models.CharField(max_length=20)
is_with_college=models.BooleanField()
employee=models.OneToOneField(Employee, on_delete=models.CASCADE)
序列化器:
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ('full_name', 'email_id', 'mobile_no', 'is_job_ready', 'type', 'location_preference')
class StudentSerializer(serializers.ModelSerializer):
employee = EmployeeSerializer(many=False)
class Meta:
model = Student
fields = ('college', 'year', 'is_with_college', 'employee')
def create(self, validated_data):
employee_data = validated_data.pop('employee')
if employee_data:
student = Student.objects.create(**validated_data)
Employee.objects.create(student=student, **employee_data)
return student
意见:
class EmployeeViewSet(viewsets.ModelViewSet):
serializer_class = EmployeeSerializer
queryset = Employee.objects.all()
class StudentViewSet(viewsets.ModelViewSet):
serializer_class = StudentSerializer
queryset = Student.objects.all()
我不确定我做错了什么。我试图改变一些事情,仍然有不同的错误。我确定这很简单,但我错过了一些东西..此刻我有:
NOT NULL constraint failed: rest_student.employee_id
答案: OneToOne 关系序列化器
希望它可以帮助某人。
解决方案
尝试遵循这个答案。
更改
employee = EmployeeSerializer(many=False)
为employee = EmployeeSerializer(read_only=True)
。要检索您不需要添加的所有学生或员工
def create(self, validated_data):
。这是更新/创建嵌套对象所必需的。
推荐阅读
- jstree - 在 jsTree 中显示自定义图像 - 从 HTM 代码构建树
- mysql - 无法更新存储函数/触发器中的表“table2”,因为它已被调用此存储函数/触发器的语句使用
- android - 扩展嵌套项 FastAdapter
- cookies - Spartacus 与 CDS 集成,清除站点数据后未设置 profile.consent.given cookie
- python-3.x - nlp:语法依赖标签“attr”到底是什么?
- mapreduce - KDB+ 网关是否必须保存所有数据?
- java - 部署后如何解决重定向问题
- javascript - 从不同文件访问函数中修改的全局变量
- css - 如何修改 Wicket 活动指示器的 CSS(例如位置)?
- sql - 获取表不为空的数据库中的所有外键关系