首页 > 解决方案 > 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()

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

标签: djangodjango-modelsdjango-formsdjango-viewsdjango-templates

解决方案


如果您的模型定义是这样的:

class Car(...):
   likes = models.ManyToManyField(User)
   model = models.CharField(...)
   year = models.IntegerField(...)

你可以这样尝试(使用distinctin 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'))

推荐阅读