Фильтрация Django по списку объектов модели

Я пытаюсь отфильтровать запрос, проверяя, что объект находится в списке этих объектов.

employee_list = [<employee: a="">, <employee: b="">, <employee: c="">]
qs = Employee.objects.filter(id__in=employee_list, [other_filters])
</employee:></employee:></employee:>

После выполнения выше qs - пустой список. Я думал, что могу составить новый список, например

employee_ids = [emp.id for emp in employee_list]
qs = Employee.objects.filter(id__in=employee_ids, [other_filters])

Я не проводил бенчмаркинг по этому методу, но я полагаю, что производительность, вероятно, будет хитом. В качестве альтернативы я мог бы впоследствии пересечь списки:

qs = Employee.objects.filter([other_filters])
filtered_qs = [emp for emp in employee_lids if emp in qs]

Однако я думаю, что удар производительности будет еще хуже.

Какой лучший/самый быстрый способ сделать это? Благодарю.

2 ответа

Поскольку Martol1ni отметил, что вы хотите фильтровать на уровне SQL, когда это возможно, поэтому я думаю, что ваши методы становятся все медленнее, но еще одна проблема...

На основе Django Docs: https://docs.djangoproject.com/en/dev/ref/models/querysets/ Я думаю, что ваш id__in должен быть списком целых идентификаторов, а не списком моделей.

Edit: О, я вижу, он объяснил это в своем ответе, но не было явным, что это было неверно в вашем вопросе.

Edit2: Но да, если вы хотите точно знать, что действительно важно, это реальная производительность, которую вы можете сделать с помощью панели инструментов django-debug. Мне кажется, что реальная проблема заключалась в неправильном использовании id__in который заставляет вас находить более id__in способы делать то, что вы хотели сделать.


Правило большого пальца состоит в том, чтобы фильтровать как можно больше через SQL, поэтому я пошел бы

qs = Employee.objects.filter(id__in=[emp.id for emp in employee_list], [other_filters])

У меня нет тестирования производительности, чтобы поддержать это.

licensed under cc by-sa 3.0 with attribution.