Объединение таблиц в Django ORM с помощью левого внешнего соединения и дополнительного условия

Я пытаюсь выполнить левое внешнее соединение между двумя моделями в Django с помощью ORM. Мне нужно включить дополнительное условие в предложение ON join, чтобы отфильтровать результаты по определенным критериям.

from django.db import models

class Author(models.Model):
    id = models.BigIntField(primary_key=True)
    name = models.CharField(max_length=50)
    book_title = model.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, db_column='author')

Есть ли способ получить все объекты книги вместе с именем автора, где title и book_title равны. sql будет выглядеть так:

select title, author, name as author_name from book left outer join author on (book.author = author.id AND book.title = author.book_title)

Поскольку

таблица очень большая (13 м), я не могу прибегнуть к сырым запросам, потому что потеряю возможность использовать PageNumberPagination. Я не хочу использовать лишнее, потому что это может привести к проблемам в будущем. Есть ли другой способ, которым я могу выполнить вышеуказанный sql, используя django orm?

Вы можете работать с F объектом [Django-doc]:

from django.db.models import F

Book.objects.filter(title=F('author__book_title'))

Однако очень странно выглядит то, что у Author есть поле book_title. Это означает, что у Author может быть только одна книга? Даже если это и так, то это будет формой дублирования данных, а оказывается, что синхронизировать данные не так просто, как может показаться.

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