gpt4 book ai didi

mysql - prefetch_related 上的 Django ORM 注释

转载 作者:行者123 更新时间:2023-11-29 03:22:52 26 4
gpt4 key购买 nike

如何在 prefetch_related 查询期间注释相关模型?

我有两个模型:

class Subject(models.Model):
...

class Student(models.Model):
subjects = models.ManyToManyField(Subject, related_name="students")

我想在单个查询中检索 Subject 对象,与每个对象相关的 Student 对象以及每个 Subject 的数量 Student 有。我正在尝试通过以下查询来完成它:

Subject.objects.all().prefetch_related(
Prefetch("student", queryset=Student.objects.all().annotate(subjects_count=Count("subject")))
)

但是我得到一个 SQL 错误:

OperationalError at/concerts/coldplay-en-madrid/
(1055,“SELECT 列表的表达式 #1 不在 GROUP BY 子句中并且包含非聚合列‘studentsubject.subject_id’,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容”)

最佳答案

因此,根据您的要求,您可以创建一个“直通”表来处理主题和学生之间的 M2M 关系。因此,您的模型看起来像:

class Subject(models.Model):
# ...

class Student(models.Model):
subjects = models.ManyToManyField(
to=Subject,
through='StudentSubject',
related_name="students")

class StudentSubject(models.Model):
student = models.ForeignKey(to=Student, related_name='student_subjects')
subject = models.ForeignKey(to=Subject, related_name='subject_students')

您可以通过 here 中的表格阅读更多信息.现在,您可以这样查询:

from django.db.models import Count
students = Student.objects.prefetch_related('student_subjects')

subjects_associated_with_students = (
students.annotate(num_subjects=Count('student_subjects'))

subjects_associated_with_students 是一个查询集,您现在可以使用它进行任何常规操作。对于前 subjects_associated_with_students.filter(num_subjects__gt=1)。这将为您提供至少拥有 1 个科目的所有学生。

希望对您有所帮助。

关于mysql - prefetch_related 上的 Django ORM 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41058808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com