2011-10-11 49 views
0

在我的Django應用程序中,我允許用戶按類別創建電影集合。這是使用3個模型,Movie,Collection和Addition表示的(Addition模型存儲電影,集合和用戶實例)。以下是所有三種型號的簡化版本。Django:基於相關字段的不同QuerySet

class Movie(models.Model): 
    name = models.CharField(max_length=64) 

class Collection(models.Model): 
    name = models.CharField(max_length=64) 
    user = models.ForeignKey(User) 

class Addition(models.Model): 
    user = models.ForeignKey(User) 
    movie = models.ForeignKey(Movie) 
    collection = models.ForeignKey(Collection) 

因此,例如,用戶可以創建一個名爲「80年代的電影」集合,和電影「奪寶奇兵」添加到他們的收藏。

我的問題是:如何根據一組查詢過濾器顯示不同的電影列表?現在我收到了一些已添加到多個集合中的電影的重複內容。我通常會使用distinct()來獲得不同的對象,但在這種情況下,我需要不同的電影而不是不同的添加,但我需要查詢Addition模型,因爲我想允許用戶查看其朋友添加的電影。

我是否以最佳方式設置我的模型?任何意見/幫助將不勝感激。

謝謝!

回答

1

首先。我不認爲你需要Addition模型在這裏。您嘗試創建許多一對多的關係,但有這樣做的documented方式:

class Movie(models.Model): 
    name = models.CharField(max_length=64) 

class Collection(models.Model): 
    name = models.CharField(max_length=64) 
    user = models.ForeignKey(User) 
    movies = models.ManyToManyField('Movie', blank=True, null=True) 

二。文檔says:「要引用」反向「關係,只需使用模型的小寫名稱」。

所以答案是(上面的設置):

Movie.objects.filter(collection__user=user).distinct()