【问题标题】:Django REST Framework nested serializer FK creationDjango REST Framework 嵌套序列化器 FK 创建
【发布时间】:2015-11-09 15:15:42
【问题描述】:

我在使用 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 请求示例:

{
    "title": "Lorem Ipsum",
    "employee_targets": [
         { "employee": 10 },
         { "employee": 11 }]
}
/* or */
{
    "title": "Lorem Ipsum",
    "employee_targets": [10,11]
}

序列化器

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 BAD REQUEST 并出现以下错误:

{
  "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 创建它们。

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

【问题讨论】:

标签: python json django django-rest-framework


【解决方案1】:

你可以试试这个吗:

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

    class Meta:
        depth = 2
        model = Employee

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2018-06-23
    • 2017-03-12
    • 2015-03-20
    • 1970-01-01
    • 2023-01-10
    • 2017-07-28
    相关资源
    最近更新 更多