【问题标题】:Django ManyToMany relationship avoid duplicatesDjango ManyToMany 关系避免重复
【发布时间】:2020-05-05 06:52:28
【问题描述】:

我已经考虑这个问题两天了,我无法解决这个问题。 所以假设我有一个名为“汽车”的模型,它与我的用户模型“配置文件”在我的用户模型(称为配置文件)中的含义有很多关系:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 如果我没有 CarLike 模型,我还能用这个还是不行?
    • 是的,它可以在没有 CarLike 的情况下工作。请查看更新后的答案
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 2018-01-21
    • 2010-09-23
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2019-02-20
    相关资源
    最近更新 更多