Удалите объекты Django QuerySet с повторяющимся значением в определенном поле. - PullRequest
2 голосов
/ 30 марта 2011

У меня есть эта модель Django (из Django CMS):

class Placeholder(models.Model):
    slot = models.CharField(_("slot"), max_length=50, db_index=True)
    default_width = models.PositiveSmallIntegerField(_("width"), null=True)

Я хочу удалить объекты-заполнители с дублирующим значением «slot», сохранив только первый из них и удалив остальные.

Как мне написать запрос (используя Django QuerySet API), который это делает?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Вы можете попробовать решение Torsten, но вместо этого использовать словарь, намного быстрее.

existing_slots = {}
for placeholder in Placeholder.objects.all():
    if existing_slots.get(placeholder.slot, False):
        placeholder.delete()
    else:
        existing_slots[placeholder.slot] = True
4 голосов
/ 30 марта 2011

Я бы сделал функциональный подход, а не один конкретный запрос, который делает все это:

existing_slots = []
for placeholder in Placeholder.objects.all():
    if placeholder.slot in existing_slots:
        placeholder.delete()
    else:
        existing_slots.append(placeholder.slot)
...