#django #django-orm
#django #django-orm
Вопрос:
Я использую пакет django_autocomplete_light
.
У меня есть простая модель под названием Tag:
class Tag(models.Model):
title = models.CharField(max_length=255)
django_autocomplete_light
при выборе всех тегов используется следующий код:
qs = Tag.objects.all()
Проблема в том, что программное обеспечение, которое я создаю, должно разрешать дублирование тегов (не мое решение). Это означает, что если есть два тега «Male» и «Male», очевидно, что в наборе запросов будут дубликаты.
Я попытался удалить эти дубликаты, изменив запрос следующим образом:
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, но каким-то образом удалить повторяющиеся теги.
К сожалению, я не могу использовать необработанный SQL-запрос, поскольку набор запросов обрабатывается несколько раз в более позднем коде.
Есть ли способ изменить запрос к базе данных или, возможно, способ вручную удалить дубликаты из набора запросов?
Любая помощь приветствуется.
Спасибо.
Комментарии:
1. Вы ищете
values
вместоvalues_list
?2. Спасибо за ваш ответ. К сожалению, это вызывает ту же проблему (однако с объектом ‘dict’ вместо объекта ‘tuple’).
Ответ №1:
Обходной путь может быть следующим. Сначала возьмите все заголовки модели тегов и поместите их в set
:
unique_titles = set(Tag.objects.values_list('title', flat=True))
Теперь каждый заголовок тега уникален.
Просто отфильтруйте теги unique_titles
, которые имеют:
unique_tags = Tag.objects.filter(title__in=unique_titles)
Комментарии:
1. Спасибо за ответ. К сожалению, unique_tags = Tag.objects.filter(title__in=unique_titles) возвращает дубликаты. Результатом первого запроса является {‘strength’} , а результатом второго запроса является <QuerySet [<Tag: strength>, <Tag: strength>]> . (Очевидно, что в базе данных есть два надежных тега).
2. упс. мой плохой, не думал об этом (
3. Ха-ха, все в порядке! Теоретически ваше решение должно работать, поскольку вы запрашиваете набор запросов. Я не понимаю, почему это не работает. В любом случае спасибо за вашу помощь.