Запрос с использованием имен связанных полей

У меня есть две модели, по которым я хотел бы выполнить обратный поиск. Мне интересно, как это сделать, учитывая тот факт, что в одной модели есть поля с внешними ключами к той же модели.

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 модели.

Вернуться на верх