2015-01-05 4 views
1

'을 통해'사용 나는 두 가지 모델이있다.중복 결과

내 모델에서 다음과 같은 표현을 사용하고 있습니다 :

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()을 쿼리 할 때 하나의 기사 만 결과로 나타납니다.

예상되는 동작 : 나는 장고 (1.7.1 및 1.7.2)를 조회하고 경우

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

사람이 버그인지 알거나

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

관찰 된 행동 나쁜 방법? 이것이 정상적인 경우 어떻게 중복을 쉽게 제거 할 수 있습니까? https://code.djangoproject.com/ticket/24079#ticket

답변

2

.distinct()를 사용하는 데 필요한 :

[편집]이 버그 경우에 티켓을 오픈. docs :

기본적으로 QuerySet은 중복 행을 제거하지 않습니다. 실제로는 Blog.objects.all()과 같은 간단한 쿼리가 결과 행 중복을 유발하지 않기 때문에 거의 문제가되지 않습니다. 그러나 쿼리가 여러 테이블에 걸쳐있는 경우 QuerySet을 평가할 때 중복 결과를 얻을 수 있습니다. 그 때 distinct()을 사용합니다.

+1

슈퍼, 두 번째 질문을 해결합니다. 그러나 그 문제에 관한 많은 문서 2 장의 주석은 그러한 종류의 문제에 도움이 될 것입니다. – Tanzaho