通过中间模型的Django queryset模型

时间:2018-08-21 12:42:50

标签: python django django-models

我有一个与Meeting相关的模型Signup,而该模型又与Attendee相关。
型号:

class Meeting(models.Model):
    date = models.DateTimeField(auto_now=False)

class Signup(models.Model):
    meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE, default=1)
    ...

class Attendee(models.Model, PrintNameTag):
    signup = models.ForeignKey(Signup, on_delete=models.CASCADE, related_name="attendee")
    attendee = models.CharField(blank=False, max_length=200)
    ...

如何在Meeting.objects上创建一个查询集,该查询集还将返回Signup和Attendee中的其他字段?我需要所有数据来生成报告。我不希望更改模型,因为这看起来应该是可行的。我还想查询会议,因为查询中还有其他一些需要会议的内容(为简单起见,已删除)。

这是我目前拥有的:

qs = Meeting.objects.filter(id__in=queryset).prefetch_related('signup').annotate(attendee_signup=F('signup__attendee_signup'))

我不断收到“无法将关键字与会者ID解析为字段”

我还尝试了以下形式的变化:

qs = Meeting.objects.filter(id__in=queryset).select_related('signup').filter(attendee__signup=signup_id)

我收到“未定义名称'signup_id'”

我是python和Django的新手,我不知道是否需要使用F和/或注释,prefech_related或select_related。我已经查看了每个文件的功能,但是找不到正确的语法来使其正常工作。我觉得我已经尝试了每个组合,而此时我只是在混搭键。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

如果您将related_name='signups'添加到Signup.meeting字段中,则此应该起作用:

meetings = Meeting.objects.filter(id__in=queryset).prefetch_related('signups__attendee')

以上内容将获取所有会议,这些会议的所有注册以及这些注册的所有与会者。从那里,您可以遍历所有内容,并且已经从数据库中获取了所有内容:

for m in meetings:
    for s in m.signups:
        for a in s.attendee:
            # whatever

(顺便说一句,我建议将related_name从“参加者”更改为“参加者”,因为复数形式往往更直观。)