Django REST框架嵌套序列化程序FK创建

2024-09-29 20:16:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用DRF嵌套序列化器创建一堆相关模型时遇到了麻烦。 外键验证失败。在

型号

class Employee(models.Model):
    user = models.OneToOneField(User)  # Django user
    ...

class Task(models.Model):
    author = models.ForeignKey(Employee, related_name='tasks')
    title = models.CharField(max_length=64)
    ...

class EmployeeTarget(models.Model):
    employee = models.ForeignKey(Employee, null=False)
    task = models.ForeignKey(Task, null=False, related_name='employee_targets')
    ...

目标

基本上,我已经创建了Employees,我想在单个请求中创建一个Task和相关的EmployeeTarget,让请求用户成为author。JSON请求示例:

^{pr2}$

序列化程序

class EmployeeSerializer(serializers.ModelSerializer):
    name = serializers.CharField(source="user.get_full_name", read_only=True)
    email = serializers.CharField(source="user.email", read_only=True)

    class Meta:
        model = Employee

class EmployeeTargetSerializer(serializers.ModelSerializer):
    employee = EmployeeSerializer()

    class Meta:
        model = EmployeeTarget

class TaskSerializer(base.ModelSerializer):
    employee_targets = EmployeeTargetSerializer(many=True, required=False)

    class Meta:
        model = Task

    def create(self, validated_data):
        employee_target_data = validated_data.pop('employee_targets')
        task = Task.objects.create(**validated_data)
        EmployeeTarget.objects.create(task=task, **employee_target_data)
        return task

视图集

class TaskViewSet(ModelViewSet):

    serializer_class = TaskSerializer

    def get_queryset(self):
        request_employee = self.request.user.employee
        return Task.objects.filter(Q(author=request_employee) |
                                   Q(employee_targets__employee=request_employee))

    def perform_create(self, serializer):
        serializer.save(author=self.request.user.employee)

结果

我收到400个错误请求,错误如下:

{
  "employee_targets": [
    {
      "employee": {
        "non_field_errors": ["Invalid data. Expected a dictionary, but got int."]
      },
      "task": ["This field is required."]
    }
  ],
  "author": ["This field is required."]
}

预期出现employee错误,但我还没有想出如何只使用ID创建它们

这里更大的问题是在封闭的TaskSerializercreate方法指定它们之前,employee_targetstaskFK处验证失败。在


Tags: nameselftaskdatamodelsrequestcreateemployee
1条回答
网友
1楼 · 发布于 2024-09-29 20:16:42

你能试试这个吗:

class EmployeeSerializer(serializers.ModelSerializer):
    name = serializers.CharField()
    email = serializers.CharField()

    class Meta:
        depth = 2
        model = Employee

相关问题 更多 >

    热门问题