Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法使用中间表中的字段过滤Django中的多对多过滤器?_Python_Django_Django Orm - Fatal编程技术网

Python 有没有办法使用中间表中的字段过滤Django中的多对多过滤器?

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

我在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, 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的查询

  • 使用Q查询“或”。因此,您的筛选查询将是
  • 您想筛选某个用户的成员资格。所以你的问题归结为
  • 获取查询的所有组ID
  • 获取所有相关组
  • 虽然我认为第4步一定有更好的解决方案,但这也很好

    如果您只是寻找组名,那么这就足够了

    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的查询

  • 使用Q查询“或”。因此,您的筛选查询将是
  • 您想筛选某个用户的成员资格。所以你的问题归结为
  • 获取查询的所有组ID
  • 获取所有相关组
  • 虽然我认为第4步一定有更好的解决方案,但这也很好

    如果您只是寻找组名,那么这就足够了

    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)