Есть ли в Django возможность создать запрос, который бы использовал два ForeignKeys для создания соединения между таблицами?
Чтобы проиллюстрировать, что я имею в виду, предположим, у меня есть следующие модели в Django:
class Author(models.Model):
name = models.TextField()
class Publisher(models.Model):
name = models.TextField()
class BooksSold(models.Model):
author = ForeignKey(Author, related_name='books_sold')
publisher = ForeignKey(Publisher, related_name='books_sold')
books_sold = models.IntegerField()
class BooksPrinted(models.Model):
author = ForeignKey(Author, related_name='books_printed')
publisher = ForeignKey(Publisher, related_name='books_printed')
books_printed = models.IntegerField()
Я хотел бы присоединиться к таблицам BooksSold и BooksPrinted, используя ключи Author и Publisher. В sql это будет:
SELECT A.author_id
,A.publisher_id
,A.books_sold
,B.books_printed
FROM table_books_sold A INNER JOIN table_books_printed
ON A.author_id = B.author_id AND
A.publisher_id = B.publisher_id
Метод, который я в настоящее время использую, состоит в том, чтобы перебрать одну из моделей, включенных через одну из ForeignKey
s, и отфильтровать с другой ForeignKey
, что будет для этого примера:
def get_books_printed(books_sold_model):
return next(b for b in books_sold_model.author.books_printed if b.publisher_id = books_sold_model.publisher_id
books_sold_models = BooksSold.objects.all().prefetch(author__books_printed)
for book_sold_model in books_sold_models:
books_printed = get_books_printed(books_sold_model)
Я хотел бы знать, есть ли способ избежать перебора всех экземпляров, пока я не найду совпадение с другими ForeignKey