Фильтр Django не работает при использовании F() с ManyToMany
У меня есть следующий запрос:
MyModel.objects.filter(foreing_key__value=F('value'))
И он отлично работает. Но теперь у меня есть несколько сложных правил, где мне нужно оценить значение ForeignKey в зависимости от некоторых условий. Для упрощения, если я переделаю запрос так:
MyModel.objects.annotate(
valid_value=F('foreing_key__value')
).filter(
valid_value=F('value')
)
Не работает, когда foreing_key__value
является NULL
. Почему это происходит? Я думаю, что это связано с LEFT JOIN, который не применяется при использовании оператора F()
, но я не знаю, как решить эту проблему.
Заранее спасибо
По какой-то причине фильтры с Q()
работают при использовании имени поля. Но когда применяется F()
, он оценивается как None
, и Q()
с равными условиями не работает, как ожидалось.
Мне нужно исправить это, используя следующий код:
MyModel.objects.annotate(
valid_value=F('foreing_key__value')
).filter(
Q(valid_value__isnull=False) & Q(valid_value=F('value'))
)
Поля в моделях с внешними ключами или моделях «многие-ко-многим» можно фильтровать без аннотации.
# MyModel.objects.filter(m2m_or_foreignkey__field=123)
MyModel.objects.filter(foreign_key__value=123)