Django условная проверка существования отношения "многие ко многим
Модель:
class RecordModel(BaseModel):
visibility_setting = models.PositiveIntegerField()
visible_to = models.ManyToManyField(UserModel, blank=True)
Мне нужно вернуть строки в зависимости от строки visibility_setting
:
- if
visibility_setting == 0
- возвращает строку без каких-либо проверок, - if
visibility_setting == 1
- мне нужно проверить, существует ли пользователь вvisible_to
m2m-отношении.
Во втором случае запрос работает нормально, но в первом случае мой подход к установке None
в первом случае не работает ( как ожидалось):
Feed.objects.filter(
visible_to=Case(
When(visibility_setting=0, then=None), # no data returned in this case, but I want to
# return all rows with visibility_setting=0
When(visibility_setting=1, then=user.id), # rows with visibility_setting=1 are queried okay
)
)
Я немного запутался, какой способ использовать в этой ситуации? Можем ли мы вообще не применять case в некоторых условиях или использовать какое-то конкретное значение по умолчанию, чтобы пропустить проверку отношений visible_to
?
Вы можете .filter(…)
[Django-doc] с:
from django.db.models import Q
Feed.objects.filter(Q(visibility_setting=0) | Q(visible_to=my_user)).distinct()
вызов .distinct()
[Django-doc].
предотвращает возврат одного и того же Feed
несколько раз.