Как запросить более двух таблиц в Django? - PullRequest
0 голосов
/ 26 октября 2019

Я хочу сделать большой запрос с несколькими таблицами. Моя модель будет написана ниже, в которой есть 5 ForeignKeys, то есть я коснусь 5 таблиц.

  class Transaction(models.Model):
    id = models.BigIntegerField(blank=True, null=False, primary_key=True)
    currency = models.ForeignKey(Currency, null=True, on_delete=models.CASCADE)
    deal = models.ForeignKey(Deal, null=True, related_name='deal', on_delete=models.CASCADE)
    service_instance = models.ForeignKey(ServiceInstance, null=True, on_delete=models.CASCADE)
    payment_source = models.ForeignKey(PayerPaymentSource, null=True, on_delete=models.CASCADE)
    payment_date = models.DateTimeField(blank=True, null=True)
    amount = models.IntegerField(blank=True, null=True)
    status = models.CharField(max_length=255, blank=True, null=True)
    context = models.TextField(blank=True, null=True)

Также PayerPaymentSource содержит ForeignKey. И от нее потребуетсяеще один запрос типа select_related()

Как реализовать такой запрос?

1 Ответ

0 голосов
/ 26 октября 2019

Согласно документации Django:

select_related ()

Возвращает QuerySet, который будет «следовать» отношениям внешнего ключа, выбирая дополнительный связанный объектданные, когда он выполняет свой запрос. Это повышение производительности, которое приводит к одному более сложному запросу, но означает, что дальнейшее использование связей внешнего ключа не потребует запросов к базе данных.

Следующие примеры иллюстрируют разницу между обычными поисками и поиском select_related (). Вот стандартный поиск:

# Hits the database.
e = Entry.objects.get(id=5)

# Hits the database again to get the related Blog object.
b = e.blog

А вот поиск select_related:

# Hits the database.
e = Entry.objects.select_related('blog').get(id=5)

# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog

И на самом деле ответ на вопрос:

Чтобы выбрать все отношения внешнего ключаВам нужно сразу указать эти поля в select_related. Если вы хотите проследить отношение внешнего ключа на двух или более уровнях, вам нужно указать его с помощью нотации __, например: foreignKey_fied__itsForeignKey.

Поэтому вам нужно использовать что-то вроде этого:

Transaction.objects.select_related('currency', 'deal', 'service_instance', 'payment_source__itsForeignKeyField')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...