2014-11-24 86 views
1

語境追加過濾器Django模型

嗨,

所以我們可以說我有兩個型號:屬性一個多對多的關係連接(一個人可以有很多屬性,一個屬性可以被許多人共享)

class Attribute(models.model): 
    attribute_name = models.CharField(max_length=100) 
    attribute_type = models.CharField(max_length=1) 

class Person(models.model): 
    article_name = models.CharField(max_length=100) 
    attributes = models.ManyToManyField(Attribute) 
  • 屬性可以是頭髮顏色,位置,大學學位等。
  • 因此,例如,屬性可能具有'計算機科學'的'attribute_name'和'D'(度數)的'attribute_type'。
  • 另一個例子是'倫敦','L'。

的問題

在這個網頁上,用戶可以通過屬性選擇的人。例如,他們可能希望看到所有居住在倫敦的人以及歷史和生物學(都與人際關係)都有學位的人。

我明白,這可能在以下(減免清晰度)表示:

Person.objects 
.filter(attributes__attribute_name='London', attributes__attribute_type='L') 
.filter(attributes__attribute_name='History', attributes__attribute_type='D') 
.filter(attributes__attribute_name='Biology', attributes__attribute_type='D') 

然而,用戶同樣可以要求誰擁有四種不同程度的用戶。關鍵是,我們不知道用戶在搜索功能中要求多少屬性。

問題

  • 因此,這將是追加這些過濾器,如果我們不知道有多少,用戶會要求什麼類型的屬性的最佳方式?
  • 像這樣追加過濾器是最好的方法嗎?

謝謝!

尼克

回答

2

你可以獲取用戶選擇的所有屬性,然後遍歷:

# sel_att holds the user selected attributes. 

result = Person.objects.all() 

for att in sel_att: 
    result = result.filter(
     attributes__attribute_name=att.attribute_name, 
     attributes__attribute_type=att.attribute_type 
    ) 
+0

我認爲這是你用這個數據設計做的最好的,但是在迭代sel_att列表之前,我會親自用'result = Person.objects.all()'開始 - 更好的可讀性IMO。對於OP - 如果您可以選擇不同的數據模型,那麼您可能會從中受益。谷歌的'實體屬性值'進行一些討論。 – 2014-11-24 22:23:50

+0

完美。我得到了這個工作!謝謝,Raydel。彼得,非常感謝小費 - 我會讀! – 2014-11-24 22:34:27

0

使用Q模塊進行復雜的查找。

例如:

from django.db.models import Q 
Person.objects.get(Q(attributes__attribute_name='London') | Q(attributes__attribute_name='History') 

在一個QuerySet一個|充當OR和,充當AND,非常符合市場預期。

chanining filters的問題是你只能實現它們之間的AND邏輯,對於一個複雜的AND,OR或NOT邏輯,Q會是更好的方法。

+0

我試過Q,但是這會告訴我所有的人都具有這些屬性中的至少一個,而我想與人*所有*他們。其次,這個查詢尤其不適用於&符號,不幸的是 - 當我用&符號嘗試時,它不返回任何結果。 – 2014-11-24 22:12:06