2010-10-20 81 views
2

在爲我學校的年鑑委員會編寫一份申請時,我對建模一個特定的關係感到死路一條。目前,我有一個照片級構造Django多對多關係

class Photo(models.Model): 
photo = models.ImageField(upload_to="user_photos/") 
name = models.CharField(blank=True, max_length=50) 

rating = models.IntegerField(default=1000) 

wins = models.IntegerField(default=0) 
matches = models.IntegerField(default=0) 

和用戶類

class UserProfile(models.Model): 
user = models.ForeignKey(User, unique=True) 
group = models.CharField(max_length=50) 

它們都順順當當工作。我想要做的是分解它,以便照片將具有來自整個用戶羣的投票的全局評級以及僅基於該照片上的用戶投票的評級。不幸的是,我對如何構建這個問題感到不知所措。我首先想到的是一個多對多的領域,但我也想,像破評級爲自己的模式是這樣的:

class Rating(models.Model) 
    photo = models.ManyToOne(Photo) 
    rating = models.IntegerField(default=1500) 

可以工作。

難道一個Django(或者真的,任何稍微有能力的人,因爲我知道我不是)大師指出我正在接近這個簡單難題的正確方向嗎?

回答

1

你想要有一個多對多的字段,但是自定義。

 
class Rating(models.Model): 
    photo = models.ForeignKey(Photo) 
    user = models.ForeignKey(User) 
    rating = models.IntegerField(default=1500) 

class Photo(models.Model): 
    photo = models.ImageField(upload_to="user_photos/") 
    name = models.CharField(blank=True, max_length=50) 

    rating = models.ManyToManyField(User, through='Rating') 

    wins = models.IntegerField(default=0) 
    matches = models.IntegerField(default=0) 

然後,您可以查詢它有一個照片對象或用戶對象。

這種方法很幼稚,不會很好地擴展。在一個非常受歡迎的網站上,評分模型會因請求而過載。更專業的網站會通過引入諸如rating_total之類的冗餘整數字段來對規則依賴進行規範化處理,並設置一個cron作業來定期更新它,以便您不需要通過多對多關係來構建查詢,但直接從場上得到結果。

+0

>這種方法很幼稚,並且不會很好地擴展 我認爲這樣做很多,但現在用戶基數很小,這是用於A/B測試的,所以現在擔心這一點可能爲時過早。現在我有我的模型的方式現在借用穿透表和ManyToMany,但也有一個globalRating類似於您建議w/cron工作的字段。 在網站上,用戶投票選擇哪張照片更好,他們的評分是使用調整後的Elo公式進行調整的,但用戶希望看到他們的評分與整個用戶羣的評分相比,因此我的問題 – 2010-10-21 20:20:24

2

你想要一個through table

+0

這正是我所尋找的,不能相信我錯過了它的文檔。謝謝! – 2010-10-21 06:20:20

0

我完全不明白你的問題,但對於一個represeting很多對一個在Django -relation您使用ForeignKey-field!但是正如伊格納西奧已經指出的,與中間模型的多對多關係對您也可能是有用的!

0

我不太明白這句話:「照片的全球評分來源於整個用戶羣的投票數,以及僅基於該照片上的用戶投票的評分。」

但是,如果您的意思是您希望爲所有用戶的費用總和創建一個字段評分,並保存另一個包含用戶照片費率的字段,你應該首先做一個想法是值得的,因爲對於計算的字段,你可以選擇在數據庫中物理存儲(全局速率)這樣的值或根據需要計算它們。你應該根據需要計算的值的頻率和需要多少信息來計算它的決定。

請注意,存儲計算的值意味着每次您對用戶速率進行更改時計算該值。