Django ManyToMany关系避免重复

时间:2020-05-05 06:52:28

标签: django django-models django-forms django-views django-templates

我已经考虑了这个问题两天了,无法解决这个问题。 因此,假设我有一个名为“汽车”的模型,该模型与我的用户模型“个人资料”之间存在许多关系,这在我的用户模型(称为个人资料)中表示:

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()

我已经为模板编写了此方法,但是如何仍能确保在获得喜欢总数时,我不会计算重复用户?我对此仍然感到困惑。

1 个答案:

答案 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'))