django - 如何加入模型并通过加入从第二个模型中获取名称
问题描述
我有一张学生桌和一张大学桌。
我似乎无法根据学生拥有的 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 获取大学名称,但这给出了错误。
解决方案
您正在使用 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_related
not prefetch_related
。
推荐阅读
- c# - 如何获取视频流并保存在磁盘上 c# Xamarin iOS
- angularjs - 在openlayers3中使用WFST更新属性信息
- node.js - 套接字 io 上的 Keycloak 身份验证
- sql - 为什么不使用 GIN 索引?
- c# - 部署后的 .NET Core PartialAsync 异常
- django - 未找到带有参数 '('',)' 的 'post_share' 的反向操作。尝试了 2 种模式:['blog\\/(?P
[0-9]+)\\/share\\/$', '博客\\/post_share\\/$'] - apache-flink - Apache Flink:注册名称冲突。名称为 *** 的 KvState 已被其他运营商注册
- spring - spring模板解析错误
- java - 将回收站视图放在底部导航上方
- sql - SQL Server - SQL 查询以查找具有不同日期的重复记录