2016-10-18 1 views
0

패키지 django_autocomplete_light을 사용하고 있습니다.QuerySet에서 고유 값을 제거하고 동시에 pk를 유지하는 방법은 무엇입니까?

내가 건물입니다 소프트웨어 중복을 허용 할 필요가
qs = Tag.objects.all() 

이의 문제입니다 : 모든 태그를 선택할 때

class Tag(models.Model): 
    title = models.CharField(max_length=255) 

django_autocomplete_light 다음 코드를 사용합니다

나는 태그라는 간단한 모델을 가지고 태그 (내 결정이 아님). 즉, "Male"과 "Male"이라는 두 개의 태그가있는 경우, QuerySet에 중복이 있음을 의미합니다.

나는 다음과 같이 쿼리를 변경하여 이러한 중복을 제거하기 위해 시도했다 :이 오류가 발생하므로

qs = Tag.objects.all().distinct() 

것은 내가 PostgreSQL을 사용하지 않을하고 그러나.

그러므로 나는이 해결 시도 :

qs = Tag.objects.all().values_list('title', flat=True).distinct() 

을하지만 그건 그냥 다음과 같은 오류가 발생합니다

AttributeError: 'str' object has no attribute 'pk' 

나는 다음에 쿼리를 변경 시도를하지만 다른 오류가 발생합니다

qs = Tag.objects.all().values_list('pk', 'title').distinct() 

AttributeError: 'tuple' object has no attribute 'pk' 

기본적으로 id 값을 유지해야하는 것처럼 보이지만 어쨌든 du를 제거합니다. plicate 태그.

나중의 코드에서 QuerySet이 여러 번 처리되므로 원시 SQL 쿼리를 사용할 수 없습니다.

내 데이터베이스 쿼리를 변경하거나 수동으로 쿼리 집합에서 중복을 제거하는 방법이 있습니까?

도움을 주시면 감사하겠습니다.

감사합니다.

+0

대신'values_list'의'values'을 찾고 계십니까 : 그냥 같은 unique_titles가있다 태그를 필터링? – Sayse

+0

답장을 보내 주셔서 감사합니다. 불행히도 동일한 문제가 발생합니다 ('tuple'객체 대신 'dict'객체로). –

답변

0

해결 방법은 다음과 같습니다. 먼저 , 태그 모델의 모든 타이틀을 가지고 가고 set에 넣어 :

unique_titles = set(Tag.objects.values_list('title', flat=True)) 

이제 모든 태그 제목이 독특합니다.

unique_tags = Tag.objects.filter(title__in=unique_titles) 
+0

답장을 보내 주셔서 감사합니다. 불행히도 unique_tags = Tag.objects.filter (title__in = unique_titles)는 중복을 반환합니다. 첫 번째 쿼리의 결과는 { 'strength'}이며 두 번째 쿼리의 결과는 , ]>입니다. (데이터베이스에는 두 개의 강도 태그가 있습니다. –

+0

oops. 내 잘못, 그것에 대해 생각하지 않았다 ( –

+0

하하 그건 괜찮아요! 당신의 QuerySet을 쿼리하는 것처럼 이론적으로 솔루션이 작동해야합니다. 왜 작동하지 않는지 이해가 안됩니다. 어쨌든 도움을 주셔서 감사합니다. –