如何计算两个多对多字段上的不同行
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 中,我如何根据两个模型中的字段自动创建多对多条目