2016-04-21 3 views
0

У меня есть список экземпляров модели django, однако некоторые из них могут быть дублирующими, как получить список, в котором все экземпляры различны?Django: Как сделать список экземпляров модели отличным?

Это не QuerySet, а список, как:

instances = [instance1, instance2, ...] 

Что я могу сделать для случаев, чтобы гарантировать все экземпляры уникальны?

+0

, когда вы говорите, что у вас есть list list list list? если да, скажи мне и ответь! – rakwen

+0

Посмотрите мой ответ! – rakwen

+0

Взгляните на мой ответ! Я отредактировал его! – rakwen

ответ

0

Вы можете использовать метод Django ORM .distinct() для возврата отдельных объектов модели.

0
Model.objects.all().values().distinct() 
0

1), если у вас есть список: Здесь у вас есть несколько вариантов: >>>

def f7(seq): 
    seen = set() 
    seen_add = seen.add 
    return [x for x in seq if not (x in seen or seen_add(x))] 

Почему правопреемником seen.add в seen_add вместо того, чтобы просто призывающих seen.add? Python - динамический язык, и разрешая see.add, каждая итерация более дорогостоящая, чем разрешение локальной переменной. seen.add может быть изменен между итерациями, а среда выполнения недостаточно умна, чтобы это исключить. Чтобы играть в это безопасно, он должен каждый раз проверять объект.

2) Если у вас есть QuerySet: Для более объяснить, читать эту >>>

Примечание

При указании имен полей, вы должны предоставить order_by() в QuerySet и поля в order_by() должен начинаться с полей в distinct(), в том же порядке.

Например, SELECT DISTINCT ON (a) дает вам первую строку для каждого значения в столбце a. Если вы не укажете заказ, вы получите произвольную строку.

пример:

>>> Author.objects.distinct() 

>>> Entry.objects.order_by('pub_date').distinct('pub_date') 
0

Вы можете использовать набор преобразования, если вы хотите использовать присущее равенство объектов:

instances = list(set(instances)) 

Если вы хотите, чтобы сделать их уникальными на основе свойства (name), используя понимание словаря - это один из способов сделать это:

instances = { i.name: i for i in instances }.values() 
Смежные вопросы