Как проверить, находится ли объект в значениях объектов массива? - PullRequest
0 голосов
/ 18 февраля 2019

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

. Я пишу пользовательское разрешение для DetailView с для House с, котороеследует разрешить запрос, только если у вас есть 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 Ответ

0 голосов
/ 18 февраля 2019

Как я уже упоминал в комментарии, проблема не в синтаксисе 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()
...