【问题标题】:How to join a model and get a name from second model via joining如何加入模型并通过加入从第二个模型中获取名称
【发布时间】:2019-06-24 09:54:59
【问题描述】:

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

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

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 获取大学名称,但出现错误。

【问题讨论】:

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


    【解决方案1】:

    您正在使用 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

    【讨论】:

    • 感谢这个工作,我必须导入泛型,然后使用 generics.ListAPIView。如果我向大学添加一个名为founded_year 的新列,我将如何显示它。我可以将字段名称添加到字段中吗? (并首先添加到模型中)
    • 您可以使用SlugRelatedField 指向目标模型上的任意字段。但如果您包含多个相关字段,此时您可能希望使用nested serializer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2013-11-06
    • 2018-11-01
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多