我已经考虑了这个问题两天了,无法解决这个问题。 因此,假设我有一个名为“汽车”的模型,该模型与我的用户模型“个人资料”之间存在许多关系,这在我的用户模型(称为个人资料)中表示:
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()
我已经为模板编写了此方法,但是如何仍能确保在获得喜欢总数时,我不会计算重复用户?我对此仍然感到困惑。
答案 0 :(得分:0)
如果您的模型定义是这样的:
class Car(...):
likes = models.ManyToManyField(User)
model = models.CharField(...)
year = models.IntegerField(...)
您可以这样尝试(使用Count
中的distinct
):
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'))