2013-05-06 80 views
1

我的問題是類似Django Advanced Filtering但我需要另一種方法:Django的:限制查詢集對用戶輸入(複選框)

摘要:

  • 表:製造商,供應
  • 製造商有多個電源( 1或0在「供應」表中)

我有一個帶有多個(20+複選框)的HTML表單,它應該限制查詢集與AND查詢(所以標準)。 HTML複選框名稱等於MySQL字段名稱。我的表看起來像這樣:

mysql> explain supply; 
+----------------------+------------+------+-----+---------+----------------+ 
| Field    | Type  | Null | Key | Default | Extra   | 
+----------------------+------------+------+-----+---------+----------------+ 
| id     | int(11) | NO | PRI | NULL | auto_increment | 
| manufacturer_id  | int(11) | NO | MUL | NULL |    | 
| supply1    | tinyint(1) | NO |  | NULL |    | 
| supply2    | tinyint(1) | NO |  | NULL |    | 
| supply3    | tinyint(1) | NO |  | NULL |    | 
| [...]    | tinyint(1) | NO |  | NULL |    | 
| supply20    | tinyint(1) | NO |  | NULL |    | 

現在,在僞SQL,我想:

  • 用戶選擇複選框SUPPLY2和supply14:SELECT * FROM supply WHERE supply2 = 1 AND supply14 = 1;
  • 用戶選擇複選框量1,supply9和supply18: SELECT * FROM supply WHERE supply1 = 1 AND supply9 = 1 AND supply18 = 1;

我很確定我需要一些與kwargs的QuerySet,但我無法爲我的需要構建視圖(仍然學習Dj安戈)。

+2

我不知道這裏的數據模型不能使用一些調整嗎?你可能想要一個有20行的供應表和一個連接它們的中間表(這是ManytoMany(Supply)或類似的東西)。然後你可以只有一個多選字段,而不是20個複選框(除非你真的需要他們出於其他原因)。 – 2013-05-06 19:31:29

+1

同意@JamesR。如果你需要另一種供應,你會怎麼做?這就是ManyToMany的關係。 – aherok 2013-05-07 10:30:41

+1

你說得對。我需要調整我的數據庫佈局。 @JamesR:如果你可以發表你的評論作爲答案,我會接受。 – weeheavy 2013-05-08 07:13:01

回答

1

我不知道這裏的數據模型是否無法使用一些調整?你可能想要一個有20行的供應表和一個連接它們的中間表(這是ManytoMany(Supply)或類似的東西)。然後你可以只有一個多選字段,而不是20個複選框(除非你真的需要他們出於其他原因)。

如果您需要添加其他供應,則只需添加另一行,而不是模式遷移。

1
supplies = Supply.objects.filter(supply1 = 1) 

如果你想再次過濾:

supplies = supplies.filter(supply2 = 1) 

的過濾器()方法返回一個QuerySet,所以你可以鏈儘可能多的過濾器()調用,只要你喜歡。

+0

謝謝,雖然這是一個選項,但它不像所需的那樣靈活,因爲我的數據庫設計是錯誤的。無論如何,+1 – weeheavy 2013-05-08 07:13:34

+0

是的,現在看一看James R的評論,我意識到他是對的,你應該優先轉換爲ManyToMany關係。 – 2013-05-08 08:46:23