Разрешить создание только в том случае, если модель является подклассом миксина
Я хотел бы разрешить создание комментария только тем моделям, которые являются подклассами определенного миксина.
Например, модель Post будет иметь обратное отношение GenericRelation к модели Comments. Модель комментариев использует пользовательский механизм типов контента, реализованный поверх django's из-за того, что проект использует шардинг между несколькими базами данных. Обратное отношение от модели Post к Comments необходимо для того, чтобы иметь возможность удалять комментарии, когда пост также удален.
Приведу простой пример кодирования того, чего я хотел бы достичь:
class Post(models.Model, HasCommentsMixin):
some_fields = ....
class HasCommentsMixin(models.Model):
has_comments = GenericRelation('comments.Comment')
class Meta:
abstract = True
Хотелось бы получить способ сказать внутри проверки разрешения модели: если класс является подклассом HasCommentsMixin, разрешить создание комментария. Таким образом, для модели Post комментарии могут быть созданы. Но если это не подкласс Mixin, комментарии не должны быть разрешены.
Надеюсь, я предоставил описание, которое имеет смысл. Я не могу поделиться реальным кодом из-за лицензии и защиты продукта.
Спасибо.
Для этого можно использовать функцию isinstance() в сочетании с функцией issubclass() в проверке разрешения, чтобы проверить, является ли модель подклассом HasCommentsMixin.
class IsCommentAllowed(permissions.BasePermission):
def has_permission(self, request, view):
model = view.get_queryset().model
if isinstance(model, HasCommentsMixin) or issubclass(model, HasCommentsMixin):
return True
return False