两种型号:

class University(models.Model):
    name = models.CharField("name", max_length = 48)
    city = models.ForeignKey(City, on_delete = models.CASCADE) 

class Course(models.Model):
    name = models.CharField("course name", max_length = 48)
    university = models.ForeignKey(University, on_delete = models.CASCADE)
    students = models.ManyToManyField(Student, related_name = "%(class)s_name", related_query_name = "student_course_qs", blank = True)
    online = models.BooleanField("online course", default = False)
    semester = models.PositiveIntegerField("choose 1-6", default = 1, choices = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)])
    time_update = models.DateTimeField("last info update", auto_now = True)

限制:如果Coursestudents,则不能是online,反之亦然.

如何获得给定city的所有Universities上的所有Courses的列表,其中Course上的latest个条目有students个,而Course个条目保存在第三个semester中?

我试着对University个不同的组进行循环,但这导致了大量的查询:

universities = University.objects.filter(city = City.objects.first())

wanted = []
for univ in universities:
    c = Course.objects.filter(university = univ).order_by("time_update").last()
    if c.semester == 3 and not c.online:
        wanted.append(c.id)

selected_courses = Courses.objects.filter(id__in = wanted)
    

我在这里看到的问题是,我创建了太多的查询,在筛选universities个查询之后,它们就已经分组了--我可以一个接一个地处理这些组,而不重新执行查询吗?

推荐答案

您可以使用子查询:

from django.db.models import F, OuterRef, SubQuery

universities = (
    University.objects.filter(city=City.objects.first())
    .annotate(
        last_course_id=Subquery(
            Course.objects.filter(university_id=OuterRef('pk'))
            .order_by('-time_update')
            .values('pk')[:1]
        )
    )
    .filter(
        course__id=F('last_course_id'), course__semester=3, course__inline=True
    )
)
selected_courses = Course.objects.filter(
    id__in=[university.last_course_id for university in universities]
)

在这里,我们首先 for each University Select 最后Course个的主键,然后我们可以使用它来过滤联接,最后我们通过一个额外的查询来获取Courses.

Django相关问答推荐

测试 - 两个类共享相同的登录代码,但它只能在一个类中工作

如何使用邮箱确认码创建django注册

dj_rest_auth 中的 PyTest 警告- RemovedInDjango40Warning: django.conf.urls.url() 已弃用,取而代之的是 django.urls.re_path()

如何连接到 docker 容器中的 postgres 数据库?

Django 和 HTML 无法从指定时间开始视频

django - 表单没有错误,但 form.is_valid() 没有验证

如何让两个模型相互引用 Django

Django REST Framework ModelSerializer get_or_create 功能

Django 管理命令参数

使用基于日期/时间的对象进行 Django 单元测试

测试 Django 信号的正确方法

Django 国际化语言代码

Django - 了解 X-Sendfile

如何使用查询参数构造 Django 反向/url?

将 jQuery 脚本添加到 Django 管理界面

'function' 对象没有属性 'as_view'

具有 2 种语言的 Django 站点

Django - 指定 Django 管理员应该使用哪个模型管理器

左加入 Django ORM

Django 字符串到日期格式