通过 m2m 关系的 table 的值过滤 django 查询集
Filtering django queryset by a value of the through table of a m2m relationship
我正在尝试这样做:
queryset.filter(m2m_related_lookup__through_table_field=值)
这些是经过简化的模型:
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)
我想这很简单,只是通过 table 自定义的很多 2 很多,所以我可以在那里存储注册日期和其他一些东西。
此关系设置为 Activity,related_name 为 'enrolled_activities'。
那么,如何使用 Django 的 ORM 查询 "all the users where the ActivityEnrolled.enrollment_date is in 2019"?
这是用于 Django 管理中 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不是指通过table而是指相关的table(这是:Activity),这个字段不存在那里。
是通过 table 而不是用户查询的唯一解决方案吗?
比如:ActivityEnrolled.objects.filter(date_enrolled__year=2019) + 对结果进行分组,因此每个用户仅 returns 一行。我知道我可以做到,但它很讨厌,我一直在努力寻找一种更干净的方法来避免它,但没有成功。
非常感谢!!
So, how can I query "all the users where the ActivityEnrolled.enrollment_date
is in 2019" using Django's ORM?
多对多关系实际上只是两个一对多表的组合。因此,我们可以过滤一对多关系:
User.objects.filter(<b>activityenrolled__enrollment_date__year=2019</b>)<b>.distinct()</b>
如果用户在 2019 年有多个 he/she 注册的活动,.distinct()
将阻止生成同一个用户。
我正在尝试这样做: queryset.filter(m2m_related_lookup__through_table_field=值)
这些是经过简化的模型:
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)
我想这很简单,只是通过 table 自定义的很多 2 很多,所以我可以在那里存储注册日期和其他一些东西。 此关系设置为 Activity,related_name 为 'enrolled_activities'。
那么,如何使用 Django 的 ORM 查询 "all the users where the ActivityEnrolled.enrollment_date is in 2019"?
这是用于 Django 管理中 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不是指通过table而是指相关的table(这是:Activity),这个字段不存在那里。
是通过 table 而不是用户查询的唯一解决方案吗? 比如:ActivityEnrolled.objects.filter(date_enrolled__year=2019) + 对结果进行分组,因此每个用户仅 returns 一行。我知道我可以做到,但它很讨厌,我一直在努力寻找一种更干净的方法来避免它,但没有成功。
非常感谢!!
So, how can I query "all the users where the
ActivityEnrolled.enrollment_date
is in 2019" using Django's ORM?
多对多关系实际上只是两个一对多表的组合。因此,我们可以过滤一对多关系:
User.objects.filter(<b>activityenrolled__enrollment_date__year=2019</b>)<b>.distinct()</b>
如果用户在 2019 年有多个 he/she 注册的活动,.distinct()
将阻止生成同一个用户。