python - 通过 m2m 关系的直通表的值过滤 django 查询集
问题描述
我正在尝试这样做: queryset.filter(m2m_related_lookup__through_table_field=value)
这些是简化的模型:
class User(models.Model):
name = models.CharField("nom", max_length=100)
surname = models.CharField("cognoms", max_length=100)
class Activity(models.Model):
name = models.CharField("Títol", max_length=200)
date_start = models.DateField("Dia inici")
date_end = models.DateField("Dia finalització")
enrolled = models.ManyToManyField(User, related_name='enrolled_activities', through='ActivityEnrolled')
class ActivityEnrolled(models.Model):
class Meta:
db_table = 'main_activity_personetes_enrolled'
activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
user = models.ForeignKey(Personeta, on_delete=models.CASCADE)
date_enrolled = models.DateTimeField("data d'inscripció")
confirmed = models.BooleanField("confirmada", default=False)
我想这很简单,只有 2 多个带有自定义直通表,所以我可以在那里存储注册日期和其他一些东西。此关系在 Activity 中设置,related_name 为“enrolled_activities”。
那么,如何使用 Django 的 ORM 查询“2019 年 ActivityEnrolled.enrollment_date 所在的所有用户”?
这是用于 Django Admin 中的 change_list 视图的自定义过滤器(使用 admin.SimpleListFilter),它列出了用户项。换句话说,就像我在做 User.objects.filter(blabla)。
尝试: queryset.filter(enrolled_activities__date_enrolled__year=2019) 显然会抛出错误Related Field got invalid lookup: date_enrolled,因为enrolled_activities不是指直通表而是指相关表(这是:Activity),并且该字段在那里不存在.
是查询直通表而不是用户的唯一解决方案吗?比如:ActivityEnrolled.objects.filter(date_enrolled__year=2019) + 对结果进行分组,因此每个用户只返回一行。我知道我可以做到,但这很讨厌,我一直在尝试找到一种更清洁的方法来避免它,但没有成功。
非常感谢!!
解决方案
那么,如何
ActivityEnrolled.enrollment_date
使用 Django 的 ORM 查询“2019 年所有用户所在的位置”?
多对多关系实际上只是两个一对多表的组合。因此,我们可以过滤一对多关系:
User.objects.filter(activityenrolled__enrollment_date__year=2019).distinct()
.distinct()
如果用户在 2019 年注册了多项活动,这将阻止产生相同的用户。
推荐阅读
- java - setDefaultHostnameVerifier 中验证方法的用途
- r - 复杂的字符串拆分为 R 中的列
- php - UpdateExistingPivot for multiple ids in loop = n+1 问题。还有其他方法吗?
- javascript - 如何从 paypal express 结帐表中删除帐单地址和联系信息?
- functional-programming - 如何从数据类型中提取元组?
- javascript - Mailchimp Ajax 重定向
- azure - 无法使用 NSG 配置 Azure App Gateway V2
- c - 向串口设备发送命令并接收响应
- c# - ErrorProvider 不显示错误信息
- c# - 在android中编写.txt文件