Как получить QuerySet со значениями определенного поля в Django, сохраняя порядок?

class Book(models.Model):
    name = models.CharField(max_length=10)


Book.objects.bulk_create([
    Book(name='A'),
    Book(name='B'),
    Book(name='C'),
])


book_names = ['C', 'D', 'A', 'B']

some_func(book_names)
# >>> [Book(name='C'), None, Book(name='A'), Book(name='B')]

Когда у меня есть список значений определенного поля объекта модели, есть ли способ реализовать функцию, которая возвращает объект модели в том же порядке в списке и возвращала None, если значение не существует? Я хочу реализовать это, используя только Django ORM запрос без использования цикла for.

preserved = Case(*[When(name=name, then=pos) for pos, name in enumerate(book_names)])
Book.objects.filter(name__in=book_names).order_by(preserved)
# >>> [Book(name='C'), Book(name='A'), Book(name='B')]

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

Вернуться на верх