Django извлекает строки для отдельных значений столбцов - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу запросить строки модели в Django,

class Language(models.Model):
    language_id = models.CharField(max_length=100, default="")
    code = models.CharField(max_length=100, default="")
    name = models.CharField(max_length=500, default="")

В этой таблице language_id не является уникальным, например, ниже приведены примеры данных

+-------------+------+---------+
| language_id | code | name    |
+-------------+------+---------+
|       12345 | en   | english |
|       12345 | te   | telugu  |
|       54321 | en   | english |
|       54321 | te   | telugu  |
+-------------+------+---------+

Я хочу отфильтровать строки (все столбцы), которые должны иметь различные language_id s.

Что я сейчас делаю.

language_list = Language.objects.all()

list = []
idlist = []

for language in language_list:
    if language.language_id not in idlist:
        il = language
        list.append(il)
        idlist.append(language.language_id)

Тогда list будет иметь все отдельные строки(модельные объекты).

Есть ли лучший способ сделать это.Я не хочу вращаться во всех language моделях.

1 Ответ

4 голосов
/ 12 апреля 2019

Неясно, что вы пытаетесь сделать.То, что делает ваш скрипт - это произвольное получение первого вхождения данного идентификатора.Если это то, что вы хотите, это будет зависеть от того, на какой базе данных основана ваша модель.PostgreSQL допускает использование в поле различных значений: https://docs.djangoproject.com/en/2.1/ref/models/querysets/#distinct

В MySQL вы можете получить все уникальные экземпляры вашего идентификатора и получить экземпляр вашей модели, совпадающий один раз для каждого идентификатора:

language_ids = Language.objects.values_list('language_id', flat=True).distinct()
result = []
for language_id in language_ids:
    result.append(Language.objects.filter(language_id=language_id).first())

Это не обязательно намного лучше, чем ваше решение, просто потому, что произвольный выбор не является ожидаемым вариантом использования для ORM.

Если, с другой стороны, вы хотели получить только language_ids, которые появляются один раз и толькоодин раз:

Language.objects.values('language_id').annotate(cnt=Count('id')).filter(cnt=1)
...