Python 有没有办法使用中间表中的字段过滤Django中的多对多过滤器?
我在Django有3个型号Python 有没有办法使用中间表中的字段过滤Django中的多对多过滤器?,python,django,django-orm,Python,Django,Django Orm,我在Django有3个型号 组,成员和用户 class Group(models.Model): name = models.CharField(max_length=32) permissions = JSONField(max_length=4096, default=list) class Membership(models.Model): user = models.ForeignKey('User', on_delete=models.CASCADE, rel
组
,成员
和用户
class Group(models.Model):
name = models.CharField(max_length=32)
permissions = JSONField(max_length=4096, default=list)
class Membership(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE, related_name='memberships')
group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='memberships')
expires_at = models.DateTimeField(null=True)
valid = models.BooleanField(default=True)
class User(models.Model):
groups = models.ManyToManyField(Group, through=Membership)
last_seen = models.DateTimeField(null=True)
created_at = models.DateTimeField(auto_now=True)
我想知道如何“过滤”用户上的多对多对象,以便仅从
expires\u at
大于now或为null的成员身份中检索组对象。谢谢大家! 我相信您正在寻找expires at That now,但我已经根据您的请求编写了expires at That now的查询
result = Membership.objects.filter(user=user).filter(Q(expires_at__gt=now) | Q(expires_at__isnull=True)).values_list('group__name', flat=True)
我相信您正在寻找expires at That now,但我已经根据您的请求编写了expires at That now的查询
result = Membership.objects.filter(user=user).filter(Q(expires_at__gt=now) | Q(expires_at__isnull=True)).values_list('group__name', flat=True)
问题不清楚。你想达到什么目标?您希望在哪一个表和字段上应用筛选器?很抱歉没有说得足够清楚,我已经更新了我的问题以使其更容易。最诚挚的道歉,问题不清楚。你想达到什么目标?您希望在哪一个表和字段上应用筛选器?很抱歉没有说得足够清楚,我已经更新了我的问题以使其更容易。最诚挚的道歉。
Membership.objects.filter(user=user).filter(Q(expires_at__gt=now) | Q(expires_at__isnull=True)).values_list('group_id', flat=True)
queryset = Membership.objects.filter(user=user).filter(Q(expires_at__gt=now) | Q(expires_at__isnull=True)).values_list('group_id', flat=True)
result = Group.objects.filter(id__in=queryset)
result = Membership.objects.filter(user=user).filter(Q(expires_at__gt=now) | Q(expires_at__isnull=True)).values_list('group__name', flat=True)