14 Июл


2017

Django дополнительные поля стандартной модели User.

Abstract User

Что из себя представляет abstract user? Это родитель нашего будущего класса User, и как родитель, он содержит стандартные поля (те что мы видим при первом запуске django) такие как: passwod, last_login, email, first_name, last_name и т.п.

Лично мне нужно было добавить несколько необязательных полей в модель user, для изменения самой системы аунтфикации (например в качестве логина принимать emal) необходимо ковырять уже AbstractBaseUser.

Первым делом создаем приложение (или пишем в уже установленном), которое логически подходит для хранения информации о нашем переопределенном пользователе. Допустим это будет UserProfile. В нашем приложении открываем models.py, подключаем саму асбтрактную модель, наследуем нашего пользоватлеля от нее, добавляем нужные поля (почти профит)

from django.db import models
from price.models import UserGroup
from django.contrib.auth.models import AbstractUser
....
class User(AbstractUser):
    balance = models.IntegerField(default=0, verbose_name='Баланс')
    usergroups = models.ForeignKey(UserGroup, verbose_name='Группа', blank=True, null=True)
....

Как видно в примере, можно также добавить связь с необходимыми моделями.

На этом конечно же не все, помните мы создали приложение UserProfile? По умолчанию Django будет все таки тянуть все данные из User, (ох уж этот глупый django) , чтобы указать ему что у нас новый User запишем в settings.py  следующее

AUTH_USER_MODEL = 'UserProfle.User'

Где UserProfile ваше приложение. 

Теперь там где вы раньше использовали для указаний связей на User, необхимо тоже самое делать на settings.AUTH_USER_MODEL, например

from django.conf import settings
......
class Order(models.Model):
    seller = models.ForeignKey(settings.AUTH_USER_MODEL)

А чтобы обратиться к полям User, и не попасть на стандартную  user модель, необходимо использовать метод get_user_model

Т.к. поля для user я поменял уже после того как написал большую часть бизнес логики, я просто записал так

from django.contrib.auth import get_user_model as User

Warning! Крайне не рекомендуется использовать асбтрактную модель если в бд уже есть важные записи. В таком случае лучше воспользоваться OneToOne моделью.

DRF
Django