Присоединение моделей в Django через 2 ForeignKeys - PullRequest
2 голосов
/ 12 мая 2019

Есть ли в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...