通过m2m关系的穿透表的值过滤Django查询集

问题描述 投票:0回答:1

我正在尝试这样做: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个很多,并带有一个自定义的贯通表,因此我可以在其中存储注册日期和其他一些信息。此关系是在“活动”中设置的,关联名称为“ enrolled_activities”。

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

这是自定义过滤器(带有admin.SimpleListFilter),用于Django Admin中的change_list视图,该视图列出了User项目。换句话说,就像我在做User.objects.filter(blabla)。

正在尝试:queryset.filter(enrolled_activities__date_enrolled__year = 2019)显然会引发错误相关字段的查询无效:date_enrolled

,因为enrolled_activities不是引用贯通表,而是关联表(这是:活动),并且此字段不存在。

是唯一查询贯通表而不是用户的解决方案吗?像:ActivityEnrolled.objects.filter(date_enrolled__year = 2019)+将结果分组,以便每个用户仅返回一行。我知道我可以做到,但是这很讨厌,我一直在尝试寻找一种更干净的方法来避免它,但是没有成功。

非常感谢!

我正在尝试执行以下操作:queryset.filter(m2m_related_lookup__through_table_field = value)这些是简化的模型:类User(models.Model):name = models.CharField(“ nom”,max_length = 100)...

python django many-to-many django-queryset django-filter
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.