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 несколько раз.

Вернуться на верх