Расширение модели django.contrib.auth.models.User с помощью пользовательских полей в Django

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

В 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 Тип содержимого: application/json Зависит: Принять Разрешить: GET, HEAD, OPTIONS

{"count": 0, "next": null, "previous": null, "results": []}

2 ответа

Решение

Вы не расширяете 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 модель.

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

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

Другие вопросы по тегам