Django模型按特定列进行过滤并去重

3

我有两个模型

class Category(models.Model):
    name= models.TextField(max_length=255)
    parent = models.ForeignKey('self', null=True, blank=True)

class Brand(models.Model):
    category = models.ForeignKey(Category)
    name= models.TextField(max_length=255)

例如:
类别
         name        parent
         -------      -------
         vehicle        0
         car            1 
         motorcycle     1 
         truck          1 
         bicycle        1
         fff            0
         ....

品牌

            name      category
            ----      --------- 
            BMW        car
            BMW        truck
            BMW        bicycle
            toyota     car
            mercedes   car
            mercedes   truck
            someThing  fff
            ....

我想创建一个品牌的查询集,根据车辆进行过滤,并按名称去重。
这样,我就可以在模板中创建一个表单,其中包含与车辆类别相关的所有品牌的下拉筛选器,而名称不会重复。
            name     category
            ----     --------- 
            BMW       car
            toyota    car
            mercedes  truck

有没有简单的选项可以完成这个任务,还是我需要编写一个函数?

我看到一个例子
在django中选择DISTINCT的个别列? 但它返回一个ValuesQuerySet,而我需要一个QuerySet,并且我不想使用只支持PostgreSQL的().distinct('someItem')

1个回答

0

避免查询集中的重复项最简单的方法是在品牌和类别模型的名称字段上添加唯一约束条件。这将阻止重复项首次插入。

当您尝试创建一个名称已经存在于数据库中的品牌或类别时,该约束将导致IntegrityError被抛出。您可以使用ModelName.objects.get_or_create而不是ModelName.objects.create()来避免错误。


在数据库中,不同类别可以使用相同的品牌,但如果我想按品牌筛选,用户在下拉菜单中不需要看到重复的名称。 - Ron
这个操作会将品牌和类别连接起来,可能会导致重复。使用distinct可以去除重复,但代价是稍微昂贵一些。Category.objects.filter(brand__name__in=("BMW", "toyota")).distinct()你可以通过查找主键并传递它来避免连接:brands = Brand.objects.filter(name__in=("BMW", "toyota")) Category.objects.filter(brand_id__in=brands) - Matt Hardcastle
我需要将品牌与类别关联起来。用户可以向系统中添加项目,当他这样做时,他必须仅选择与该类别相关的品牌,因此我会向他显示与他所在类别相关的相关品牌,并且他可以按品牌、类别或类别和相关品牌筛选项目。 - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接