Лучшие практики для расширения пользовательской модели в django - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть модель Custom User в моем приложении

class User(AbstractBaseUser, PermissionsMixin):
    uuid = models.UUIDField(default=uuid.uuid4, unique=True)
    email = models.EmailField(_('email address'), db_index=True, unique=True)

и это AUTH_USER_MODEL = 'users.User' в моем файле настроек.

Теперь я хочу создать модель поверх этого пользовательского Пользовательская модель (Пользователь), назовем его Агентом, эта модель будет иметь три столбца:

user_uuid #Foreign Key Refernce(OnetoOne) to the Custom User Model
uuid # unique identifier for Agent model
scope # CharField specific to Agent model

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 28 апреля 2020

Хотя наилучшей практики не существует, все зависит от того, что вы делаете, наиболее вероятным методом работы является поле type с указанием Agent и таблица один-к-одному (документы) для дополнительных полей.

Вы можете создавать записи по мере необходимости. В том, что вы делаете, нет ничего особенного только потому, что это пользователь.

class AgentDetails(Model):
    user = OneToOneField(User, primary_key=True, on_delete=CASCADE)
    ...

Более полная модель пользователя будет выглядеть примерно так:

class User(AbstractBaseUser, PermissionsMixin):
    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ["name"]

    email = EmailField(unique=True, db_index=True)
    name = CharField(max_length=100)
    type = ChoiceField(choices=[('user','User'),('agent','Agent')])
    is_staff = models.BooleanField(default=False, help_text='If the user can log into this admin site.')
    is_active = models.BooleanField(default=True, help_text='If the user is active, instead of deleting')
    created_at = models.DateTimeField('Date Joined', default=timezone.now)

    objects = MyUserManager() # 

Кроме того, вам, вероятно, понадобится добавить:

  1. Пользовательскую страницу администратора
  2. Пользовательский UserManager

Вы можете получить одну таблицу из абстрактная база, но это сгенерирует 1 таблицу для каждого типа пользователя, которая не будет работать со стандартной аутентификацией. Для получения информации см. Django Наследование модели .

class User(Model):
    email = EmailField()

    class Meta:
        abstract = True

class Agent(User): # generates table 1
    extra_field = CharField()

class Standard(User): # generates table 2
    extra_field = CharField()

Если указанная вами пользовательская модель завершена, то я не думаю, что она будет работать со значением по умолчанию django инфраструктура. Из вашего вопроса не ясно, нужна ли вам помощь по этому вопросу.

...