使用 'through' 时 `ManyToManyField` 的重复结果
Duplicate results of `ManyToManyField` when using 'through'
我有两个模型:用户和文章
每个 User 都可以通过选择一个或多个 Tag.
创建一篇 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
您需要使用 .distinct()
。来自 docs:
By default, a QuerySet will not eliminate duplicate rows. In practice, this is rarely a problem, because simple queries such as Blog.objects.all()
don’t introduce the possibility of duplicate result rows. However, if your query spans multiple tables, it’s possible to get duplicate results when a QuerySet is evaluated. That’s when you’d use distinct()
.
我有两个模型:用户和文章 每个 User 都可以通过选择一个或多个 Tag.
创建一篇 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
您需要使用 .distinct()
。来自 docs:
By default, a QuerySet will not eliminate duplicate rows. In practice, this is rarely a problem, because simple queries such as
Blog.objects.all()
don’t introduce the possibility of duplicate result rows. However, if your query spans multiple tables, it’s possible to get duplicate results when a QuerySet is evaluated. That’s when you’d usedistinct()
.