通过m2m关系的直通表的值过滤django查询集

Per*_*ell 4 python django many-to-many django-queryset django-filter

我正在尝试执行此操作:\nqueryset.filter(m2m_lated_lookup__through_table_field=value)

\n\n

这些是简化的模型:

\n\n
class User(models.Model):\n    name = models.CharField("nom", max_length=100)\n    surname = models.CharField("cognoms", max_length=100)\n\nclass Activity(models.Model):\n    name = models.CharField("T\xc3\xadtol", max_length=200)\n    date_start = models.DateField("Dia inici")\n    date_end = models.DateField("Dia finalitzaci\xc3\xb3")\n    enrolled = models.ManyToManyField(User, related_name=\'enrolled_activities\', through=\'ActivityEnrolled\')\n\nclass ActivityEnrolled(models.Model):\n    class Meta:\n        db_table = \'main_activity_personetes_enrolled\'\n\n    activity = models.ForeignKey(Activity, on_delete=models.CASCADE)\n    user = models.ForeignKey(Personeta, on_delete=models.CASCADE)\n    date_enrolled = models.DateTimeField("data d\'inscripci\xc3\xb3")\n    confirmed = models.BooleanField("confirmada", default=False)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想这很简单,只是一个多2多的自定义直通表,这样我就可以在那里存储注册日期和其他一些东西。\n此关系在“活动”中设置,相关名称为“enrolled_activities”。

\n\n

那么,如何使用 Django 的 ORM 查询“ActivityEnrolled.enrollment_date 在 2019 年的所有用户”?

\n\n

这是用于 Django 管理中的 Change_list 视图的自定义过滤器(使用 admin.SimpleListFilter),该视图列出了用户项目。换句话说,就像我正在做 User.objects.filter(blabla) 一样。

\n\n

尝试: queryset.filter(enrolled_activities__date_enrolled__year=2019) 显然会抛出错误“相关字段获取无效查找:date_enrolled”,因为“enrolled_activities”不是引用直通表而是引用相关表(这是:“活动”),并且该字段不存在在那里。

\n\n

是查询直通表而不是用户的唯一解决方案吗?\n例如:ActivityEnrolled.objects.filter(date_enrolled__year=2019) + 对结果进行分组,以便每个用户只返回一行。我知道我可以做到这一点,但这非常令人讨厌,我一直在尝试找到一种更干净的方法来避免它,但没有成功。

\n\n

非常感谢!!

\n

Wil*_*sem 5

ActivityEnrolled.enrollment_date那么,如何使用 Django 的 ORM查询“2019 年所在的所有用户”呢?

多对多关系实际上只是两个一对多表的组合。因此,我们可以通过以下方式过滤一对多关系:

User.objects.filter(activityenrolled__enrollment_date__year=2019).distinct()
Run Code Online (Sandbox Code Playgroud)

.distinct()如果该用户在 2019 年注册了多项活动,则将防止生成同一用户。