django - Django ManyToMany 关系避免重复
问题描述
我已经考虑这个问题两天了,我无法解决这个问题。因此,假设我有一个名为“汽车”的模型,它与我的用户模型“配置文件”在我的用户模型(称为配置文件)中的含义有很多关系,我有:
cars = models.ManyToManyField(Cars, related_name = 'profiles')
现在汽车模型有很多对多的关系称为喜欢,所以每当用户喜欢一辆车时,它将通过以下方式添加到该车的喜欢中:
car.likes.add(user)
现在我的“汽车”模型将有 4 个字段,分别是型号、年份、名称、颜色。问题是我想查询数据库,这样我就可以获得特定型号和年份的所有汽车的点赞数。意思是无论名称和颜色如何,我都想获得喜欢的数量。现在我知道如果所有具有特定型号和年份的型号都可以通过以下方式获得喜欢:
def get_total_likes(self):
Car.likes.through.objects.filter(car__model=self.model, car__year=self.year).count()
现在想象一个场景,用户喜欢型号=A、年份=1、颜色=r、名称=某物的汽车,然后他们决定喜欢型号=A、年份=1、颜色=b、名称=某物的汽车.
获取总喜欢数时如何不计算重复用户?我的意思是,如果用户已经喜欢同名同年份的车型,我怎么能不计算用户呢?
我写了这个方法:
def is_liked(self,user):
return Car.likes.through.objects.filter(car__model=self.model, car__year=self.year, profile_id=user.id).exists()
我已经为我的模板编写了这个方法,但是我怎样才能确保在获得喜欢的总数时我不会计算重复的用户?我仍然对此感到困惑。
解决方案
如果您的模型定义是这样的:
class Car(...):
likes = models.ManyToManyField(User)
model = models.CharField(...)
year = models.IntegerField(...)
你可以这样尝试(使用distinct
in Count
):
from django.db.models import F, Count
cars = Car.objects.annotate(
like_count=Count(
'likes',
filter=Q(
model=F('model'),
year=F('year')
),
distinct=True
)
)
print(cars.values('model', 'year', 'like_count'))
推荐阅读
- latex - 用浮点数对齐 LaTeX 中的并排表格
- chart.js - 无法从 mouseenter 上的 chartjs-annotation-plugin 获取事件
- c# - 当容器的位置每次都可以改变时,有没有更好的方法从下拉列表中选择一个项目
- python - 熊猫:分组和聚合
- excel - 如何根据日期匹配将边框单元格与特定日期更改为范围?
- r - 多个输出的一个操作按钮闪亮
- node.js - 无法从axios返回结果
- ios - 尝试为 iOS Mac M1 芯片运行或构建 Flutter 项目时出错
- sas - PROC MEANS 与上一份报告的结果进行比较
- r - R中的正则表达式:找到第n个出现并根据某些条件添加一些字母