2014-09-05 72 views
1

考慮兩個Django模型「用戶」和「棋盤遊戲」,後者有一個多對多場通過表一中自定義的「票」:雙向表和Django的ORM

class Vote(models.Model): 
    user = models.ForeignKey(User) 
    boardgame = models.ForeignKey(BoardGame) 
    vote = models.IntegerField() 

我需要打印兩頂部有用戶名稱,左側列板遊戲名稱和中間投票。

有沒有辦法使用django來獲取這個? (請記住,用戶可能不會投票每一個棋盤遊戲。)

UPDATE:更多詳細

1)顯然,這可以使用Python的一些線(這可能會導致許多查詢要制定出數據庫),但我更感興趣的是發現django中是否有直接實現的功能可以完成這項工作。畢竟ManyToMany字段只不過是一個雙向表(在這種情況下與一些數據關聯)。

2)一個可能的'解決方案'將是一個完整的外部連接使用原始查詢,但是,再次,我正在尋找內置Django內置的東西。

3)更具體地說,我使用基於類的視圖,我想知道是否存在適當的查詢來關聯到ListView的queryset參數。

+0

你嘗試過這麼遠嗎?模型定義了數據庫模式,理論上你可以存儲和檢索你想要的數據,但是你需要建立你的視圖和模板(加上任何css或js)來顯示錶格 – br3w5 2014-09-05 20:44:56

+0

請看我的更新部分題。 – Sirion 2014-09-05 21:38:01

回答

0

假設:

class User(models.Model): 
    ... 

class BoardGame(models.Model): 
    users = models.ManyToManyField(User, through='Vote') 
    ... 

class Vote(models.Model): 
    user = models.ForeignKey(User) 
    boardgame = models.ForeignKey(BoardGame) 
    vote = models.IntegerField() 

會的工作是這樣的:

from django.db import connections, reset_queries 
reset_queries() 

users = User.objects.all().prefetch_related('vote_set') 
table = [] 
table.append([''] + list(users)) 
for board_game in BoardGame.objects.all().prefetch_related('vote_set'): 
    row = [board_game] 
    for user in users: 
     for vote in user.vote_set.all(): 
      if vote in board_game.vote_set.all(): 
       row.append(vote) 
       break 
     else: 
      row.append('') 
    table.append(row) 

len(connection.queries) # Returns always 4 

這不是你想要的解決方案,但它表明了一種只有4查詢從數據庫中獲取表中沒有關於你有多少物體。

+0

謝謝,但有沒有一種方法可以通過單個查詢來獲取?基本上我需要django做一個完整的外部連接。另請參閱我的問題中的更新部分。 – Sirion 2014-09-05 21:40:55

+0

我在這裏提出的表是一個嵌套列表。如果你只想得到一個查詢集,這將永遠不會嵌套。查詢集應該包含哪些對象?用戶,桌面遊戲,投票還是全部?可能是一個簡短的例子會有幫助嗎? – Norman8054 2014-09-05 22:01:41

+0

查詢集只包含投票對象,但也包含那些實際上沒有投票的元組,因此不會記憶在數據庫中,即用戶可能已經投票了一些棋盤遊戲,但不是全部投票。結果應該是[this](http://syllabus.bos.nsw.edu.au/assets/mathematicsk10/images/s3sp004.png),但可能會丟失一些數字(即投票)。 – Sirion 2014-09-05 22:17:18

0

我不認爲這是在Django的核心或通用的基於類的意見,這將使得表爲你做什麼,而是要設法django-tables2

+0

我並不是對呈現表格的東西有嚴格的興趣,而是想找到一種方法來檢索滿足我需求的查詢集。 – Sirion 2014-09-05 22:23:20