【问题标题】:Filter subset of a queryset in Django在 Django 中过滤查询集的子集
【发布时间】:2019-12-04 22:26:43
【问题描述】:

我有这些模型:

class Committee(models.Model):
    title = models.CharField("Title",max_length=50,null=False)
    members = models.ManyToManyField(User)

class Meeting(models.Model):
    title = models.CharField("Title",max_length=50,null=False)
    date = models.DateTimeField("Date",null=False)
    committee = models.ForeignKey(Committee, on_delete=models.CASCADE)

我希望我的视图返回登录用户所在的所有委员会,并且只返回已经发生的会议。我正在尝试这段代码:

class MeetingsView(generic.ListView):
    template_name = 'meetings/index.html'
    context_object_name = 'committees_list'
    login_required = True

    def get_queryset(self):
        return Committee.objects.filter(members__id=self.request.user.id,meeting__date__lte=timezone.now())

这将返回一个查询集,其中不包括今天之前没有开会的委员会。我想要的是获得所有委员会,以及按日期过滤的 meeting_set。还有其他方法吗?

【问题讨论】:

  • 听起来你要求的是两种不同的东西;用户所属的委员会,以及他们过去的会议。是这样吗?
  • 请通过meeting_set to be filtered by the date 阐明您想要什么。您希望在什么日期之前过滤所有会议? date 不是委员会成员。
  • date 是会议的一部分,与委员会有关。我想要委员会的meeting_set 中按日期过滤的委员会的会议。实际上它返回所有相关的会议。

标签: python django django-queryset django-filter


【解决方案1】:

如果您只想获取特定会议,请使用预取。它将链接到所有相关的Committee 对象:

def get_queryset(self):
    prefetch = Prefetch('meeting_set', queryset=Meeting.objects.filter(date__lte=timezone.now()), to_attr='past_meetings')
    return Committee.objects.filter(members__id=self.request.user.id).prefetch_related(prefetch)

然后在您使用的模板中访问过去的会议:

{% for committee in committee_list %}
    {{ committee.past_meetings }}
{% endfor %}

【讨论】:

  • 这正是我所需要的。在timezone.now() 之后仅缺少一个)。非常感谢!
  • for 中的.all 也不是必须的。
  • @William 欢迎您!我根据您的 cmets 更新答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 2020-08-22
  • 2019-04-15
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多