@pyHammer

Как расширить User используя Django REST?

Нужно расширить модель User, почему то стандартный метод не работает или я не понял как REST настроить.
models.py
class Organization(models.Model):
    name = models.CharField(verbose_name=_('Name'), max_length=45)

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True)
    organization = models.ForeignKey(Organization, verbose_name=_('Organization'))

serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

views.py
class UserList(generics.ListAPIView):
    serializer_class = UserSerializer
     
    def get_queryset(self):
        return User.objects.all()

settings.py
...
AUTH_PROFILE_MODULE = 'app.UserProfile'
...

В результате этого я получаю это:
[
    {
        "id": 1,
        "password": "pbkdf2_sha256$24000$JtpvZFHDv9SN$aTC3Za/bRJJUvFEGUgmYo9hLKAqBmstNDXe3WZ9+a4Q=",
        "last_login": "2016-01-23T14:35:57Z",
        "is_superuser": true,
        "username": "root",
        "first_name": "",
        "last_name": "",
        "email": "",
        "is_staff": true,
        "is_active": true,
        "date_joined": "2016-01-23T14:35:15Z",
        "groups": [],
        "user_permissions": []
    }
]

Ни каких намеков на UserProfile...
Если выходить в shell, то и там ничего про get_profile
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(pk=1)
>>> dir(user)

Буду благодарен за любую помощь!
  • Вопрос задан
  • 1351 просмотр
Решения вопроса 2
У вас всё не правильно.
Ознакомьтесь с этим https://docs.djangoproject.com/en/1.9/topics/auth/...

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True)
    organization = models.ForeignKey(Organization, verbose_name=_('Organization'))

...
AUTH_PROFILE_MODULE = 'app.UserProfile'

Это в корне не верно, вы не расширили модель пользователя, вы создали просто некую модель которая ссылается на пользователя - это не верно!

Вам нужно унаследоваться от стандартной модели и уже туда добавить новое поле:
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    organization = models.ForeignKey(Organization, verbose_name=_('Organization'))


Лучше всего это делать при старте нового проекта, если уже используются пользователи в системе вы не можете просто взять и включить новую кастомную модель, у вас всё сломается, есть хорошее решение как безболезненно мигрировать: https://pypi.python.org/pypi/django_custom_user_mi...
Воспользовался им около месяца назад, всё отлично, только делайте бэкапы и точно следуйте инструкциям!

После того как появятся новые кастомные пользователи, вы уже не сможете делать такие запросы:
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(pk=1)
>>> dir(user)


Придётся делать примерно так:
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.get(pk=1)
dir(user)

И так везде где вы раньше использовали django.contrib.auth.models:User
Ответ написан
Приведу свой пример. Django REST Framework я, правда, пока не использую, но, возможно, поможет разобраться:
crm/crm/settings.py
AUTH_USER_MODEL = "profiles.CRMUser"

crm/profiles/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models


class CRMUser(AbstractUser):
    org = models.ForeignKey('main.Organization', null=True, blank=True)

    def __str__(self):
        return '{} / {}'.format(self.username, self.org.name if self.org else "")

    class Meta:
        verbose_name = 'Пользователь'
        verbose_name_plural = 'Пользователи'

Дальше везде, где нужно использовать модель пользователя, делаю:
from profiles.models import CRMUser
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@deliro
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы