【问题标题】:Duplicate results of `ManyToManyField` when using 'through'使用“通过”时“ManyToManyField”的重复结果
【发布时间】:2015-01-05 09:57:59
【问题描述】:

我有两个模型:User 和 Article 每个用户可以通过选择一个或多个标签来创建一篇文章。

我在我的模型中使用以下表示:

class User(models.Model):
    name = models.CharField(max_length=200, null=False, blank=False, default=None)
    articles = models.ManyToManyField(Article, null=True, blank=True, default=None, through='Tag')

class Article(models.Model):
    url = models.URLField(unique=True)

class Tag(models.Model):
    name = models.CharField(max_length=200, null=False, blank=False, default=None)
    article = models.ForeignKey(Article)
    user = models.ForeignKey(User)

现在,我可以分别添加用户和文章。然后我可以将用户与文章相关联。 假设我只有<user 1> 和<article 1>。我创建了两个不同的标签(通过管理员完成):

          Tag1
<user 1>  --->   <article 1>
          Tag2
<user 1>  --->   <article 1>

我仍然只有一个用户,只有一篇文章,但有两个标签链接它们。 当我查询 user1.article.all() 时,我希望只有一篇文章作为结果。

预期行为:

user = User.objects.get(pk=1)
print user.article.all()
[<Article: 1>]

观察到的行为

user = User.objects.get(pk=1)
print user.article.all()
[<Article: 1>, <Article: 1>]

任何人都知道这是一个错误还是我以一种不好的方式查询 Django(1.7.1 和 1.7.2)? 如果这是正常的,我怎样才能轻松删除重复项?

[编辑] 打开一张票以防它是一个错误:https://code.djangoproject.com/ticket/24079#ticket

【问题讨论】:

    标签: django many-to-many django-database


    【解决方案1】:

    您需要使用.distinct()。来自docs:

    默认情况下,QuerySet 不会消除重复行。在实践中,这很少会成为问题,因为像Blog.objects.all() 这样的简单查询不会引入重复结果行的可能性。但是,如果您的查询跨越多个表,则在评估 QuerySet 时可能会得到重复的结果。那时你会使用distinct()。

    【讨论】:

    • 超级,解决了第二个问题。但是,man 2 many 文档中关于该问题的评论应该有助于解决此类问题。
    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多