【问题标题】:Django: distinct QuerySet based on a related fieldDjango:基于相关字段的不同查询集
【发布时间】:2011-12-05 01:22:38
【问题描述】:

在我的 Django 应用程序中,我允许用户按类别创建电影集合。这使用 3 个模型来表示,Movie、Collection 和 Addition(Addition 模型存储电影、集合和用户实例)。所有三种模型的简化版本如下。

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 模型,因为我希望允许用户查看他们的朋友添加的电影。

我是否以最佳方式设置模型?任何建议/帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2012-12-03
      • 2012-01-01
      • 2020-07-31
      • 2023-03-25
      • 2018-10-11
      • 2014-01-18
      相关资源
      最近更新 更多