Как удалить различные значения из набора запросов и сохранить pk одновременно?

#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. Ха-ха, все в порядке! Теоретически ваше решение должно работать, поскольку вы запрашиваете набор запросов. Я не понимаю, почему это не работает. В любом случае спасибо за вашу помощь.