Как изменить выражение ON в django-orm select_related()
Итак, у меня есть следующие модели
class ApplicationForHelp(BaseModel):
user = models.ForeignKey(User, related_name="applications", on_delete=models.CASCADE)
tags = models.ManyToManyField(TagsForApplication, related_name="applications")
title = models.CharField(max_length=50)
description = models.TextField()
is_anonymous = models.BooleanField(default=False)
place = models.TextField(null=True)
И модель пользователя
so if do ApplicationForHelp.objects.filter().select_related('user')
что это делает : left join ON application.user_id = user.id
что я хочу : left join ON (application.user_id = user.id и application.is_anonymous=False)
>В документации к объектам FilteredRelation говорится:
FilteredRelation используется с annotate() для создания предложения ON, когда выполняется JOIN. JOIN.
Учитывая usernames, итерабельность имен пользователей, и предполагая, что ищется ApplicationForHelp объект, чей user внешний ключ имеет имя пользователя в usernames и чье is_anonymous поле False:
from django.db.models import FilteredRelation, Q
apps = (
ApplicationForHelp.objects
.annotate(
not_anonymous=FilteredRelation(
'user',
condition=Q(is_anonymous=False)
)
)
.filter(not_anonymous__username__in=usernames)
.select_related('user')
)