【问题标题】:Django model filter and do distinct by specific columnDjango模型过滤器并按特定列区分
【发布时间】:2018-02-22 05:47:21
【问题描述】:

我有两个模型

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

有没有什么方法可以用简单的方法来做,或者我需要为此编写一个函数吗?

我看到了一个例子
Select DISTINCT individual columns in django? 但它返回一个ValuesQuerySet,我需要一个QuerySet,我不想使用仅在PostgreSQL 上支持的().distinct('someItem')

【问题讨论】:

    标签: python django python-3.x django-models


    【解决方案1】:

    避免 QuerySet 中出现重复的最简单方法是在 Brand 和 Category 模型的名称字段中添加 unique constraint。这将首先阻止重复插入。

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

    【讨论】:

    • 可以在数据库中为不同类别使用相同的品牌,但如果我想按品牌过滤,用户不需要在下拉重复名称中看到
    • 这会加入品牌和类别,这可能会导致重复。 distinct 会以稍微昂贵的代价移除它们。 Category.objects.filter(brand__name__in=("BMW", "toyota")).distinct() 您可以通过 pk 查找品牌并将其传入:brands = Brand.objects.filter(name__in=( "BMW", "toyota")) Category.objects.filter(brand_id__in=brands)
    • 我需要将品牌加入到类别中,因为它们是相关的。用户可以将项目添加到系统中,当他这样做时,他必须只选择与该类别相关的品牌,所以我向他显示与他所在类别相关的相关品牌,他可以按品牌过滤项目,类别,或类别和相关品牌
    猜你喜欢
    • 2019-01-13
    • 2020-08-02
    • 2014-08-22
    • 2012-03-13
    • 1970-01-01
    • 2020-03-25
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多