Как присоединиться к модели и получить имя от второй модели через присоединение - PullRequest
0 голосов
/ 24 июня 2019

У меня есть стол для студентов и стол для университета.

Кажется, я не могу получить название университета на основании имени университета: студент имеет

База данных:

Студенты:

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)

Я пытался получить название университета с использованием student_q.name, но это выдает ошибку.

1 Ответ

0 голосов
/ 24 июня 2019

Вы используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...