2011-10-11 16 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()