Объединение таблиц в 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
может быть только одна книга? Даже если это и так, то это будет формой дублирования данных, а оказывается, что синхронизировать данные не так просто, как может показаться.