Джанго запрос, где в - PullRequest
23 голосов
/ 10 мая 2011

Как это сделать с помощью запроса объекта django:

 SELECT * FROM test WHERE (test_id IN (SELECT test_id FROM test_subject_set)) AND (test_begin_time < '') AND (test_end_time > '')

Модель:

class Test(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User)
    groups = models.ManyToManyField(Group)


class TestSubjectSet(models.Model):
    id =  models.AutoField(primary_key=True)
    test = models.ForeignKey(Test)

Ответы [ 3 ]

31 голосов
/ 10 мая 2011

Два набора запросов - это документированный способ сделать это. В любом случае это будет один удар по базе данных.

test_ids = Subject.objects.all()
result = Test.objects.filter(test_id__in=test_ids).filter([some other filtering])
7 голосов
/ 10 мая 2011

У DrTyrsa это почти что было.

test_ids = list(TestSubjectSet.objects.all().values_list('test_id', flat=True))
result = Test.objects.filter(id__in=test_ids, test_begin_time__lt='', test_end_time__gt='')

То, как это делала Tyrsa, не дало бы вам список идентификаторов Test из TestSubjectSet, а вместо этого предоставило бы вам набор запросов TestSubjectSet.

Кроме того, меня смутили поля test_begin_time и test_end_time, потому что вы не упомянули их в своих моделях.

Обновление: Используется list () в наборе запросов, поскольку, согласно ссылке, размещенной DrTyrsa, базы данныхmsgstr "не очень хорошо оптимизировать вложенные наборы запросов".

0 голосов
/ 24 октября 2018

этот рабочий для меня:

Line.objects.filter(pk__in=[1, 2, 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...