简体   繁体   English

使用 django-rest-framework 序列化程序获取外键值

[英]Get a Foreign Key value with django-rest-framework serializers

I'm using the django rest framework to create an API.我正在使用 django rest 框架创建一个 API。

models.py模型.py

class DepartmentModel(models.Model):
    DeptID = models.AutoField(primary_key=True)
    DeptName = models.CharField(max_length=100)

    def __str__(self):
        return self.DeptName

    class Meta:
        verbose_name = 'Department Table'

class EmployeeModel(models.Model):
    Level_Types = (
        ('Genin', 'Genin'),
        ('Chunin', 'Chunin'),
        ('Jonin', 'Jonin'),
    )

    EmpID = models.AutoField(primary_key=True)
    EmpName = models.CharField(max_length=100)
    Email = models.CharField(max_length=100,null=True)
    EmpLevel = models.CharField(max_length=20, default="Genin", choices=Level_Types)
    EmpPosition = models.ForeignKey(DepartmentModel, null=True, on_delete=models.SET_NULL)

    class Meta:
        verbose_name = 'EmployeeTable'  # Easy readable tablename - verbose_name

    def __str__(self):
        return self.EmpName

serializer.py序列化器.py

from appemployee.models import EmployeeModel,DepartmentModel
        
class EmployeeSerializer(serializers.ModelSerializer):

    emp_dept = serializers.CharField(source='DepartmentModel.DeptName')
    class Meta:
        model = EmployeeModel
        fields = ('EmpID','EmpName','Email','EmpLevel','emp_dept')

views.py视图.py

class EmployeeTable(APIView):

    def get(self,request):
        try:
            emp_obj = EmployeeModel.objects.all()
            empserializer = EmployeeSerializer(emp_obj,many=True)
        except Exception as err:
            return Response(err)
        return Response(empserializer.data)

this would provide me with:这将为我提供:

[
    {
        "EmpID": 1,
        "EmpName": "Hashirama Senju",
        "Email": "hashirama.senju@konaha.com",
        "EmpLevel": "Jonin",
        "EmpPosition": 1
    },
    {
        "EmpID": 2,
        "EmpName": "Tobirama Senju",
        "Email": "tobirama.senju@konaha.com",
        "EmpLevel": "Jonin",
        "EmpPosition": 2
    },
    {
        "EmpID": 3,
        "EmpName": "Hiruzen Sarutobi",
        "Email": "hiruzen.sarutobi@konaha.com",
        "EmpLevel": "Jonin",
        "EmpPosition": 5
    }
]

what i really want is我真正想要的是

[
    {
        "EmpID": 1,
        "EmpName": "Hashirama Senju",
        "Email": "hashirama.senju@konaha.com",
        "EmpLevel": "Jonin",
        "DeptName": "Hokage"
    },
    {
        "EmpID": 2,
        "EmpName": "Tobirama Senju",
        "Email": "tobirama.senju@konaha.com",
        "EmpLevel": "Jonin",
        "DeptName": "Hokage"
    },
    {
        "EmpID": 3,
        "EmpName": "Hiruzen Sarutobi",
        "Email": "hiruzen.sarutobi@konaha.com",
        "EmpLevel": "Jonin",
        "DeptName": "Hokage"
    }
]

DeptName is in the department model. I want to combaine the results of both serializers and display it. DeptName 在部门 model 中。我想合并两个序列化程序的结果并显示它。

PS: The JSON result is just for an example. PS:JSON结果只是一个例子。 Cannot display real data.无法显示真实数据。

emp_dept = serializers.CharField(source='EmpPosition.DeptName')

add emp_dept in your fields as well在您的字段中也添加 emp_dept

this is my response that I just get in which color_name comes from another model这是我刚刚得到的回复,其中 color_name 来自另一个 model

       {
            "id": 6,
            "full_name": "nlah bkadkf",
            "password": "pbkdf2_sha256$390000$ELBf2Bo3t8sjFp2fQLWsnJ$eGcd29VaeqFTka/rkKIcfLRe/bbiToWd23wIHEq+8x0=",
            "username": "kashi",
            "first_name": "nlah",
            "last_name": "bkadkf",
            "email": "kashi@gmail.com",
            "address": "fkjdas",
            "mobile_number": "56789",
            "is_delete": false,
            "color_name": "Green"
        }

this is my serializer这是我的序列化程序

class UserSerializer(serializers.ModelSerializer):
    color_name = serializers.CharField(source='color.color_name', read_only=True)
    full_name = serializers.CharField(read_only=True)
    is_delete = serializers.BooleanField(read_only=True)

    class Meta:
        model = User
        fields = ['id', 'full_name', 'password', 'username', 'first_name', 'last_name', 'email', 'address',
                  'mobile_number', 'is_delete', 'color_name']
class EmployeeSerializer(serializers.ModelSerializer):

    emp_dept = serializers.CharField(source='DepartmentModel.DeptName')
    class Meta:
        model = EmployeeModel
        fields = ('EmpID','EmpName','Email','EmpLevel','emp_dept')

     def to_representation(self, instance):
        rep = super(EmployeeSerializer, self).to_representation(instance)
        rep['EmpLevel'] = instance.EmpLevel
        rep['emp_dept'] = instance.emp_dept.DeptName
        return rep

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM