Django ORM: предварительная фильтрация связанных полей внутри набора запросов - PullRequest
0 голосов
/ 24 сентября 2018

Представьте, что у меня есть две модели A и B, которые определены (свободно) как

class A(models.Model):
    a_flag = models.BooleanField()

class B(models.Model):
    b_flag = models.BooleanField()
    a = models.ForeignKey('A', ...)

Я хочу иметь набор запросов A с a_flag=Trueи для них я хочу, чтобы дальнейшие запросы к a.b.filter(...) были «предварительно отфильтрованы» с b_flag=True.Есть ли способ сделать это без переопределения RelatedManager для B (все еще кажется хакерским решением)?

UPD: внешний ключ был наоборот

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете использовать Prefetch -объект [Django-doc] (не путать с вызовом .prefetch_related(..)) и выполнить некоторую фильтрацию в этой точке.

Например:

A.objects.filter(
    a_flag=True
).prefetch_related(
    <b>Prefetch('b_set', queryset=B.objects.filter(b_flag=True), to_attr='b_pos')</b>
)

Так что теперь QuerySet будет содержать коллекцию A с атрибутом b_pos, который содержит связанные B объекты, нос b_flag=True.

Так, учитывая, что есть три связанных B s для данного A объекта, но только два имеют b_flag=True, тогда b_pos будет содержать эти два.

Я бы действительно посоветовал , а не , нацелиться на b_set, так как если вы передадите объект A методу, этот метод будет предполагать, что b_set просто предоставляет все реализованные Bs.

...