python - Django REST Framework 嵌套序列化器 FK 创建

标签 python json django django-rest-framework

我在使用 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,获取请求用户作为作者。 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

View 集

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 方法。

最佳答案

你能尝试一下吗:

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

    class Meta:
        depth = 2
        model = Employee

关于python - Django REST Framework 嵌套序列化器 FK 创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042693/

相关文章:

向量化双求和的 Pythonic 方法

iphone - 按升序对 NSDictionary 进行排序

python - 你如何在 Python/Django/MySQL 中避免这种竞争条件?

json - 如何在 Django 中访问 json 数据?

python - Python中如何根据属性选择子类

python - 如何为类类型创建 OUTPUT 类型映射?

python - Session.run(fetches) 是否保证按顺序执行其 "fetches"参数?

python - 只能在 OSX 上的 rpy2 中导入一些包,其他包会出现 SIGSEGV 错误

javascript - 使用 cakePHP 3 将 JSON 对象保存为具有关联的实体

java - Jackson 序列化 View : nested object