如何加入模型并通过加入来从第二个模型获得名称

时间:2019-06-24 09:54:59

标签: django python-3.x django-models django-rest-framework

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

我似乎无法根据学生拥有的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

Models.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)

views.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”来获得大学名称,但这会出错。

1 个答案:

答案 0 :(得分:0)

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

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_related而不是prefetch_related