Django 在同一查询中获得一对多
Django getting one to many on same query
我需要在 html 中的手风琴上显示带有课程及其可靠讲座的视图。
一个课程有很多个讲座。
class Course(models.Model):
title = models.CharField(max_length=1500)
def __str__(self):
return self.title
class Lecture(models.Model):
title = models.CharField(max_length=1500)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
content = models.TextField()
def __str__(self):
return self.title
好像是我找到的所有例子。像这样过滤或获取第一个对象后获取关系:
Course.objects.first().lecture_set.all()
这得到了第一个的所有讲座。但是我需要获得所有课程的所有课程。像这样:
Course.objects.all().lecture_set.all() or Course.objects.filter('all').lecture_set.all()
这样我就可以迭代课程,然后在每个课程上再次迭代 Course.lectures
有人知道实现此目标的最佳做法吗?
您可以使用 prefetch_related()
在你的例子中就像
Course.objects.all(). prefetch_related('lecture_set')
因此,之后您可以在不访问数据库的情况下迭代所有课程并获取其讲座。确保您将通过对象本身访问它,例如:
{% for course in courses_list %}
{% for lecture in course.lecture_set.all() %}
检查每个请求的详细信息(例如每个请求的数据库连接数)是很好的library。所以你可以优化你的代码。
希望我有所帮助。
我需要在 html 中的手风琴上显示带有课程及其可靠讲座的视图。 一个课程有很多个讲座。
class Course(models.Model):
title = models.CharField(max_length=1500)
def __str__(self):
return self.title
class Lecture(models.Model):
title = models.CharField(max_length=1500)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
content = models.TextField()
def __str__(self):
return self.title
好像是我找到的所有例子。像这样过滤或获取第一个对象后获取关系:
Course.objects.first().lecture_set.all()
这得到了第一个的所有讲座。但是我需要获得所有课程的所有课程。像这样:
Course.objects.all().lecture_set.all() or Course.objects.filter('all').lecture_set.all()
这样我就可以迭代课程,然后在每个课程上再次迭代 Course.lectures
有人知道实现此目标的最佳做法吗?
您可以使用 prefetch_related()
在你的例子中就像
Course.objects.all(). prefetch_related('lecture_set')
因此,之后您可以在不访问数据库的情况下迭代所有课程并获取其讲座。确保您将通过对象本身访问它,例如:
{% for course in courses_list %}
{% for lecture in course.lecture_set.all() %}
检查每个请求的详细信息(例如每个请求的数据库连接数)是很好的library。所以你可以优化你的代码。
希望我有所帮助。