Django:基于相关字段的不同QuerySet

时间:2011-10-11 06:45:50

标签: django django-models django-queryset

在我的Django应用程序中,我允许用户按类别创建电影集。这是使用3个模型,电影,收藏和添加(加法模型存储电影,集合和用户实例)表示的。以下是所有三种型号的简化版本。

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 个答案:

答案 0 :(得分: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()