2017-09-13 46 views
2

我有兩個型號Django模塊過濾器,做不同的特定的列

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

回答

0

,以避免在您的查詢集副本的最簡單方法是在名稱字段中添加unique constraint爲您的品牌和品類的機型。這將停止首先插入重複項。

的約束將導致IntegrityError拋出試圖創建一個品牌或類別誰的名字已經存在於數據庫中的任何時間。您可以通過使用ModelName.objects.get_or_create代替ModelName.objects.create()避免錯誤。

+0

可以在數據庫中爲不同類別設置相同的品牌,但如果我想按品牌過濾,用戶無需在下拉菜單中查看重複名稱 – Ron

+0

這會加入可能導致重複的品牌和類別。一個明顯的將以略微昂貴的代價去除它們。 Category.objects.filter(brand__name__in =( 「寶馬」, 「豐田」))不同的() 您可以避免通過PK仰視的品牌並通過了加入: 品牌=品牌。 objects.filter(name__in =( 「寶馬」, 「豐田」)) Category.objects.filter(brand_id__in =品牌) –

+0

我需要加入品牌類,因爲它們是相關的。用戶可以將項目添加到系統中,當他這樣做,他只能選擇那些與類別相關的品牌,讓我展示他有關,他是該類別中的相關品牌,他可以按品牌,類別篩選項目或類別和相關品牌 – Ron