【问题标题】:I want to Serialize dept_name as well as it's "id" in one single model serializer. How should I do it?我想在一个模型序列化程序中序列化 dept_name 以及它的“id”。我该怎么做?
【发布时间】:2019-11-02 09:04:25
【问题描述】:

我想在部门模型的员工模型序列化器中序列化“部门名称”(dept_name) 以及部门 ID(id)

在员工序列化程序中,我想对“部门名称”和“部门 ID”模型进行序列化。我在 Employee Serializer 的 Meta 类中也提到了部门模型

型号

class Department(models.Model):
    dept_name = models.CharField(max_length=10)


class Employee(models.Model):
    emp_name = models.CharField(max_length=15)
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=14)
    designation = models.CharField(max_length=20)
    dept_id = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True, blank=True)

    class Meta:
        ordering = ('id',)

    def __str__(self):
        return self.emp_name

序列化器

class DepartmentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Department
        fields = [
            'id',
            'dept_name',
        ]


class EmployeeSerializer(serializers.ModelSerializer):
    dept_id = serializers.SlugRelatedField(queryset=Department.objects.all(), slug_field='dept_name')
    deptname = DepartmentSerializer()
    
    class Meta:
        model = Employee,Department
        fields = [
            'id',
            'emp_name',
            'email',
            'password',
            'designation',
            'dept_id',
            'deptname',
        ]

【问题讨论】:

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


    【解决方案1】:

    记得在 Employee 查询集上选择相关('dept')。

    class Department(models.Model):
        dept_name = models.CharField(max_length=10)
    
    
    class Employee(models.Model):
        emp_name = models.CharField(max_length=15)
        email = models.EmailField(unique=True)
        password = models.CharField(max_length=14)
        designation = models.CharField(max_length=20)
    
        # .._id suffix django will implement automatically
        dept = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True, blank=True) 
    
        class Meta:
            ordering = ('id',)
    
        def __str__(self):
            return self.emp_name
    
    
    class DepartmentSerializer(serializers.ModelSerializer):
        class Meta:
            model = Department
            fields = ('id', 'dept_name')
    
    
    class EmployeeSerializer(serializers.ModelSerializer):
        dept = DepartmentSerializer()
    
        class Meta:
            model = Employee
            fields = ('id',
                      'emp_name',
                      'email',
                      'password',
                      'designation',
                      'dept')
    

    【讨论】:

      【解决方案2】:

      您可以在EmployeeSerializer 中使用深度。它将返回所有部门对象的字段。

      ================== depth = 1 => 返回一级深度。 depth = 2 => 返回两个深度。

      像这样:

      class DepartmentSerializer(serializers.ModelSerializer):
      
          class Meta:
              model = Department
              fields = '__all__'
      
      
      class EmployeeSerializer(serializers.ModelSerializer):
      
          class Meta:
              model = Employee
              fields = '__all__'
              depth = 1
      
      

      【讨论】:

        猜你喜欢
        • 2021-12-22
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2023-02-21
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        相关资源
        最近更新 更多