Как проверить, находится ли объект в значениях объектов массива?

Я создаю сервер для Django Rest Framework. Он моделирует дома, договоры и владельцев. В основном, House может иметь несколько Contractс и каждый Contract имеет Owner,

Я пишу пользовательское разрешение для DetailViewс для Houses, которые должны разрешить запрос, только если вы владеете House (если у тебя есть Contract для этого House а ты Owner,

Вот что у меня так далеко:

class UserOwnsTheHouseSlugInUrlPermission(permissions.BasePermission):
    """
    Permission to check if the user is an owner for the given House.
    This permission needs a house_slug to be given in the url.
    """
    message = _(USER_IS_NOT_OWNER_PERMISSION_DENIED_MESSAGE)

    def has_object_permission(self, request, view, obj):
        owner = get_object_or_None(UserOwnerProfile, user=request.user)
        if owner and owner in obj.contracts.owner:
            return True

        return False

Этот код не работает. В JavaScript вы можете написать:

if(obj.contracts.map(contract => contract.owner).includes(owner))

Или что-то подобное. Python не является моим основным языком, поэтому я не знаю, как выразить это условие в Python или Django.

Как бы вы пошли о написании этого? большое спасибо

1 ответ

Решение

Как я упоминал в комментарии, проблема не в синтаксисе Python. Проблема в том, что obj.contracts предположительно ForeignKey, который возвращает набор запросов; набор запросов не будет иметь owner атрибут, то есть поле в каждом из экземпляров модели в наборе запросов.

Теперь вы можете сделать это, чтобы получить список всех владельцев:

if owner and owner in obj.contracts.values_list('owner', flat=True)

но это было бы неправильным решением. Что вы на самом деле хотите сделать, это спросить базу данных, есть ли владелец в списке владельцев контрактов:

if owner and obj.contracts.filter(owner=owner).exists()
Другие вопросы по тегам