2016-11-04 2 views
0

Наша команда создает приложение, которое требует легкого переключения между пользовательскими подклассами. Каждая роль пользователя имеет разные поля, поэтому их не нужно переносить, но каждый экземпляр пользователя должен быть прикреплен к одному из этих подкадров.Django - Идиоматический способ изменения ролей пользователей

Что является самым идиоматичным способом переключения этих ролей? Должны ли мы вообще использовать подклассы?

Я видел эти страницы: Convert a subclass model instance to another subclass model instance in django? Change class of child on django models

Мы предварительно прод, и поэтому открыт для изменения схемы, если есть лучший подход, в отличие от этих двух примеров.

+0

Почему вы не использовали собственную инфраструктуру 'permissions' django, которая позволит вам создать группу и« назначить права доступа к группам », а затем добавить пользователя в группу, в которой пользователь может иметь разрешение на модели, и вы можете проверить разрешение, используя разрешительный декор или смеси? – cutteeth

+0

Разрешения - это не единственное, что отличается. В одном подклассе есть некоторые компоненты, которые не отображаются в других, которые связывают эти подклассы с конкретными таблицами в схеме. Похоже, это не решило бы нашу проблему. –

ответ

0

Если вы в порядке с пользовательской моделью пользователя, вы можете достичь этого, используя GenericForeignKey.

У вас может быть одна модель пользователя с общими атрибутами/поведением и несколькими моделями, которые реализуют поведение, связанное с этими ролями. Поэтому, если вам нужно изменить указанную роль для пользователя, вы можете просто удалить старый связанный экземпляр одной модели и создать экземпляр другого.

class CustomUser(AbstractUser): 
    role_ct = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    role_id = models.PositiveIntegerField() 
    role = GenericForeignKey 

class Role1(models.Model): 
    """Some stuff here""" 

class Role2(models.Model): 
    """Some other stuff here""" 

Однако следует помнить о предостережениях: GenericForeignKeys может быть немного медленнее, и немного сложнее работать.

Если это кажется излишним для вашего случая, вы можете просто пойти с разрешениями администратора django, как это было предложено cutteeth.

Смежные вопросы