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

avatar
Jason Howard
8 августа 2021 в 18:34
29
1
1

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

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 имеет два внешних ключа, указывающих на модель корзины. Как мне это исправить?

Спасибо!

Источник
wim
8 августа 2021 в 18:38
0

Покажите модель тележки?

Jason Howard
8 августа 2021 в 18:41
0

добавил это к моему вопросу. Спасибо!

Ответы (1)

avatar
Willem Van Onsem
8 августа 2021 в 18:41
1

If you specify a related_query_name=… parameter [Django-doc] or a **related_name=… parameter [Django-doc], then that это имя для доступа к модели в обратном порядке, поэтому вы можете запросить с помощью:

Review.objects.filter(cart__cart_one__employee=employee)

или, если вы хотите запросить в обратном порядке с помощью unscheduled_job, то это:

Review.objects.filter(cart__cart_two__employee=employee)

Вы также можете комбинировать эти два объекта, например bo5th cart и fd 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.