Запрос с использованием имен связанных полей
У меня есть две модели, по которым я хотел бы выполнить обратный поиск. Мне интересно, как это сделать, учитывая тот факт, что в одной модели есть поля с внешними ключами к той же модели.
class Review(models.Model):
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, default=None)
class Cart(models.Model):
cost = models.DecimalField(max_digits=50, decimal_places=2, null=True, blank=True)
class Job(models.Model):
cart = models.ForeignKey(Cart, related_name="cart_one", on_delete=models.CASCADE, null=True, blank=True)
unscheduled_job = models.ForeignKey(Cart, related_name="cart_two", on_delete=models.CASCADE, null=True, blank=True)
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, null=True, blank=True)
Мой запрос выглядит следующим образом:
reviews = Review.objects.filter(cart__job__employee=employee)
Этот запрос не выполняется из-за того, что модель Job имеет два внешних ключа, которые указывают на модель cart. Как мне это исправить?
Спасибо!
Если вы указываете related_query_name=…
параметр [Django-doc] или **related_name=…
параметр [Django-doc], то это имя для обратного доступа к модели, так что вы можете сделать запрос с:
Review.objects.filter(cart__cart_one__employee=employee)
или если вы хотите сделать запрос в обратном направлении с помощью unscheduled_job
, то это будет:
Review.objects.filter(cart__cart_two__employee=employee)
Вы также можете объединить оба, так bo5th cart
anfd unscheduled_job
, используя объект Q
:
from django.db.models import Q
Review.objects.filter(Q(cart__cart_one__employee=employee) | Q(cart__cart_two__employee))
Однако, возможно, вы захотите изменить related_name=…
s, поскольку это должно быть имя для доступа к объекту Job
с точки зрения Cart
модели.