2015-07-21 2 views
2

Я использую Django 1.8.2 с python 2.7.3, rest framework и allauth. Я пытаюсь расширить django.contrib.auth.models.User для добавления пользовательских полей, но возвращаемый JSON пуст, и есть пользователи, созданные:Расширение модели django.contrib.auth.models.User с настраиваемыми полями в Django

В models.py

from django.contrib.auth.models import User 
from django.db import models 

class MyUser(models.Model): 
    user = models.OneToOneField(User) 
    black_coffee = models.IntegerField(default=0) 
    coffee_with_milk = models.IntegerField(default=0) 
    coffee_cut = models.IntegerField(default=0) 

В serializers.py

from rest_framework import serializers 
from cafeterias.models import MyUser 

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    # snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True) 

    class Meta: 
     model = MyUser 
     fields = ('username', 'black_coffee', 'coffee_with_milk', 'coffee_cut') 

В views.py

from cafeterias.models import MyUser 
from rest_framework import permissions 
from rest_framework import viewsets 

class UserViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = MyUser.objects.all() 
    serializer_class = UserSerializer 
    permission_classes = (permissions.AllowAny, 
          IsOwnerOrReadOnly,) 

Вот результат JSON:

HTTP 200 OK Content-Type: применение/JSON Vary: Accept Allow: GET, HEAD, OPTIONS

{ "Количество": 0, "рядом": нулевой, "предыдущий": NULL, "результаты": []}

+0

Почему вы делаете это через поле OneToOne? https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#specifying-a-custom-user-model ... вы не можете напрямую обращаться к полю базовой модели (например, 'username'), если вы используете метод onetoone, и похоже, что вы в настоящее время создаете django auth 'User', не создавая связанный' MyUser' – Anentropic

+0

Потому что я пытаюсь получить поля пользователя. Должен ли я наследовать от AbstractBaseUser. AbstractBaseUser? – david

+1

да, расширьте 'AbstractUser', это упростит. Не забудьте установить настройку 'AUTH_USER_MODEL' https://docs.djangoproject.com/en/1.8/themes/auth/customizing/# substituting-a-custom-user-model – Anentropic

ответ

5

Вы не расширяя User модель правильно.

Чтобы расширить модель User с помощью дополнительных полей, мы можем использовать модель AbstractUser. Это предоставит мне все поля User, такие как username, email и т. Д. Теперь мы можем добавить все дополнительные поля в MyUser.

Мы должны сделать что-то вроде:

models.py

from django.contrib.auth.models import AbstractUser 

class MyUser(AbstractUser): 
    black_coffee = models.IntegerField(default=0) 
    coffee_with_milk = models.IntegerField(default=0) 
    coffee_cut = models.IntegerField(default=0) 

Это обеспечит все User поля вместе с 3 дополнительных полей в MyUser модели.

+0

Я все еще получаю пустой json: {"count": 0, "next": null, "previous": null, "results" : []} – david

+0

Существуют ли какие-либо объекты в db, так как теперь вы изменили модель. Кажется, что в db нет объектов. –

+1

В конце концов, я добавил AUTH_USER_MODEL = 'myapp.Myuser' в настройках и удалил и воссоздал базу данных, спасибо – david

0

Это должен быть просто комментарий, но у меня недостаточно репутации, чтобы оставить комментарий.

Мне кажется, что вам нужна модель профиля пользователя. Here вы можете видеть, как это делается. Обратите внимание на вызов post_save.connect(...). Это необходимо для автоматического создания нового профиля, каждый из которых создается новым пользователем, и кажется, что это именно то, чего вам не хватает.

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