【问题标题】:How to create DRF Reverse Deep Nested (indepth : 4) Json Object?如何创建 DRF 反向深度嵌套(深度:4)Json 对象?
【发布时间】:2021-10-02 08:21:19
【问题描述】:

如何通过Project单API实现ProjectEmployee、Employee、EmployeeSpecialization、AvailableWorkField?所有这些都通过多对多关系连接。

这里我展示了一个简短的模型代码:

class Project(models.Model):
    title = models.CharField(max_length=300, primary_key=True, unique=True)


class Employee(models.Model):
    name = models.CharField(max_length=300, blank=True, null=True)


class AvailableWorkField(models.Model):
    available_field_position = models.CharField(max_length=100)


class EmployeeSpecialization(models.Model):
    employee = models.ForeignKey(Employee, related_name='employee_specialization_employee', on_delete=models.CASCADE)
    preferred_field = models.ForeignKey(AvailableWorkField, related_name='employee_specialization_available_work_field',
                                        on_delete=models.CASCADE)


class ProjectEmployee(models.Model):
    project = models.ForeignKey(Project, related_name='project_employee_project', on_delete=models.CASCADE)
    employee = models.ForeignKey(Employee, related_name='project_employee_employee', on_delete=models.CASCADE)
    project_position = models.CharField(max_length=100)

这是我的序列化器:

class AvailableWorkFieldSerializers(serializers.ModelSerializer):
    class Meta:
        model = AvailableWorkField
        fields = '__all__'


class EmployeeSpecializationSerializers(serializers.ModelSerializer):
    employee_specialization_available_work_field = AvailableWorkFieldSerializers(many=True, read_only=True)

    class Meta:
        model = EmployeeSpecialization
        fields = '__all__'


class EmployeeSerializers(serializers.ModelSerializer):
    employee_specialization_employee = EmployeeSpecializationSerializers(many=True, read_only=True)

    class Meta:
        model = Employee
        fields = '__all__'


class ProjectEmployeeSerializers(serializers.ModelSerializer):
    project_employee_employee = EmployeeSerializers(many=True, read_only=True)

    class Meta:
        model = ProjectEmployee
        fields = '__all__'


class ProjectSerializers(serializers.ModelSerializer):
    project_employee_project = ProjectEmployeeSerializers(many=True, read_only=True)

    class Meta:
        model = Project
        fields = '__all__'

我想要一个像这样的复杂嵌套 JSON 对象用于项目休息 API:

[
  {
    "title": "RevSurvey",
    "project_employee_project": [
      {
        "id": 2,
        "project_position": "Django",
        "project": "RevSurvey",
        "employee": {
          "id": 1,
          "name": "david",
          "preferred_field": [
            {
              "id": 1,
              "available_field_position": "Laravel"
            }
          ]
        }
      }
    ]
  }
]

但我期待得到:

[
  {
    "title": "RevSurvey",
    "project_employee_project": [
      {
        "id": 2,
        "project_position": "Django",
        "project": "RevSurvey",
        "employee": 1
      }
    ]
  }
]

【问题讨论】:

    标签: django rest django-models django-rest-framework


    【解决方案1】:

    试试这个:

    class ProjectEmployeeSerializers(serializers.ModelSerializer):
        employee = EmployeeSerializers(read_only=True)
    
        class Meta:
            model = ProjectEmployee
            fields = '__all__'
    

    ProjectEmployee 的上下文中,您可以通过employee 获取员工。而且由于是外键而不是反向关系,所以只有一个对象,所以不能使用many=True

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-24
      • 2017-08-27
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 2019-07-19
      • 1970-01-01
      相关资源
      最近更新 更多