首页 > 解决方案 > 如何加入模型并通过加入从第二个模型中获取名称

问题描述

我有一张学生桌和一张大学桌。

我似乎无法根据学生拥有的 university_id 检索大学名称

数据库:

学生:

id, first_name, last_name, university_id
0, bob, jones, 12
1, Tim, Smith, 13

大学:

id,   name
12  Harvard
13  Stanton
14  N/A

模型.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)

    class Meta:
        verbose_name = "University"
        verbose_name_plural = "Universities"

    #__unicode__
    def __str__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, on_delete=models.DO_NOTHING)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"
    #__str__
    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

视图.py

class View_all_apiview(APIView):
    def get(self, request, *args, **kwargs):

        students_q = Student.objects.all().prefetch_related('university')

        return JsonResponse(list(students_q.values()), safe=False)

我尝试使用students_q.name 获取大学名称,但这给出了错误。

标签: djangopython-3.xdjango-modelsdjango-rest-framework

解决方案


您正在使用 Rest 框架。因此,您应该使用序列化程序来确定要显示的字段。

class StudentSerializer(serializers.ModelSerializer):
    university = serializers.StringRelatedField()

    class Meta:
        model = Student
        fields = ('id', 'first_name', 'last_name', 'university')

在这里,StringRelatedField使用__str__相关模型的方法,在您的情况下使用名称。

现在您的视图可以是:

class AllStudents(ListAPIView):
    queryset = Student.objects.all().select_related('university')
    serializer_class = StudentSerializer 

请注意,由于您要遵循前向关系,请使用select_relatednot prefetch_related


推荐阅读