#python #flask #getter-setter
#python #flask #средство получения-установки
Вопрос:
У меня есть следующий класс / модель:
class Recipe(db.Model):
...
user_id = db.Column(db.ForeignKey(("users.id")), nullable=False, index=True)
author = db.relationship("User", uselist=False, back_populates="diets")
...
# Permissions
def can_view(self, user = None) -> bool:
if user is None:
user = current_user
return self.author == user
Я могу использовать recipe.can_view()
или recipe.can_view(some_user)
, но я хочу иметь возможность вызывать recipe.can_view
вместо recipe.can_view()
, и я не знаю, какое хорошее решение для этого.
Спасибо
Комментарии:
1. Я боюсь, что у вас не может быть одного имени и ожидать, что Python прочитает ваши мысли. Если вы можете сделать
recipe.can_view(user)
, тоcan_view
это вызываемый. Это не может быть одновременно bool. (создание вызываемого bool было бы возможно, но не идите этим путем)2. Итак, мне нужно иметь отдельно именованный атрибут? О, позор. Но я вижу, как то, что я хочу, может вызвать некоторые проблемы. Спасибо!
3. Я бы выбрал
can_view(user)
и необязательноcan_current_user_view
…4. Имеет смысл, приятный и явный (только бит длиной). Спасибо!
Ответ №1:
Похоже, я не могу этого сделать (по крайней мере, не создавая беспорядка).
Итак, я выбрал решение, предложенное @zvone в комментариях:
Я бы пошел с
can_view(user)
иcan_current_user_view
Итак, мой код:
def can_view(self, user) -> bool:
return self.is_author(user) or user.is_admin or self.is_public
@property
def can_current_user_view(self) -> bool:
return self.can_view(user=current_user)