如何计算两个多对多字段上的不同行

Posted

技术标签:

【中文标题】如何计算两个多对多字段上的不同行【英文标题】:How to Count distinct rows over two ManyToMany Fields 【发布时间】:2020-09-24 09:47:30 【问题描述】:
from django.db import models

class Group(models.Model):
  users = models.ManyToMany(User, blank=True, related_name="groups"


class Task(models.Model):
  users = models.ManyToManyField(User, blank=True, related_name="personal_tasks")
  groups = models.ManyToManyField(Group, blank=True, related_name="group_tasks")

注意:上面的代码是为了演示概念,它不是正在使用的代码。

那么以上面的模型为例,是否有可能(最好使用单个查询)获得唯一用户的总数?

我最初只是想将 users 字段和 groups__users 字段的计数相加,但是,我想考虑到有人亲自和通过他们的小组分配任务的可能性。

【问题讨论】:

所以您想获取组中唯一用户的数量对吗? 使用 Through 属性,再创建一个表(如果没有指定,django 会自动创建),假设你叫它GroupUser,然后使用过滤器:GroupUser.objects,filter(group=gid).distinct() @CharanjitSingh 但 OP 可能还需要来自 Tasks.users 的用户,并将这些用户与 Tasks.groups.users 结合起来,然后得到一个独特的。 @shad0w_wa1k3r 是的,这就是我需要做的。 what 的唯一用户总数?对于单个任务?每个任务?你如何计算用户数?只有users,还是groups 中的那些? 【参考方案1】:

如果你使用基于 CBv 类的视图!!

在 Views.py 中:

class yourclass(ListView):
    model = YourModel
    template_name = '....'
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Count_Somthing'] = YourModel.objects.all().count()
        return context   

在您的模板 html 中使用:Count_Somthing

如果你使用 Function :使用过滤器很容易

def Your_Fonction(request):
    search_for= YourModel.objects.get(any_fields= pk)
    Count_Somthing=search_for.count()
  return(request,'....html',Count_Somthing)

在您的模板 html 中使用:Count_Somthing

【讨论】:

这不是最优的,这也是 O(n) 请再读一遍这个问题,他要求的是查询,而不是查看

以上是关于如何计算两个多对多字段上的不同行的主要内容,如果未能解决你的问题,请参考以下文章

多对多字段的 Django 表单上的逗号分隔文本而不是多项选择

在 Django 中,我如何根据两个模型中的字段自动创建多对多条目

Django Rest Framework(多对多字段上的 GET 过滤器)

如何使用多对多字段填充默认表单数据?

Django 如何对多对多字段进行批量add

Laravel 多列上的多对多同步()