Django - как написать этот запрос так, чтобы не требовалось DISTINCT - PullRequest
0 голосов
/ 06 июля 2011

Я работаю с моделью:

class Foo(models.Model):
    name = models.CharField(max_length=255)
    bars = models.ManyToManyField('Bar')

В представлении у меня есть доступ к списку Bar объектов и мне нужно получить все Foo объекты, которые имеют любой из Bar объекты в их списке bars, поэтому я делаю это:

foos = Foo.objects.filter(bars__in=list_of_bars)

Проблема в том, что есть дубликаты, если Foo имеет 2 бара, и оба этих бара находятся в моем list_of_bars, который решается простым distinct:

foos = Foo.objects.distinct().filter(bars__in=list_of_bars)

Это все хорошо, за исключением того, что добавление DISTINCT к запросу делает его очень медленным из-за2 миллиона Foo объектов в базе данных.

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

1 Ответ

1 голос
/ 06 июля 2011

Вы всегда можете выбрать уникальные в Python:

foos = set(Foo.objects.filter(bars__in=list_of_bars))

Вам нужен набор запросов. Так что, может быть (просто может быть) этот быстрый мерзкий хак может помочь тебе. Это некрасиво, но, возможно, это быстро (не уверен в этом).

def get_query_set(self):
    foos = set(Foo.objects.filter(bars__in=list_of_bars))
    return Foo.objects.filter(id__in=[f.id for f in foos])
...