使用Django中的自定义字段扩展django.contrib.auth.models.User模型

时间:2015-07-21 17:02:07

标签: python json django django-rest-framework django-allauth

我使用Django 1.8.2和python 2.7.3,休息框架和allauth。我试图扩展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 Content-Type:application / json 变化:接受 允许:GET,HEAD,OPTIONS

{     "计数":0,     " next":null,     "之前":null,     "结果":[] }

2 个答案:

答案 0 :(得分:5)

您没有正确地扩展User模型。

要使用额外字段扩展User模型,我们可以使用AbstractUser模型。这将为我提供Userusername等所有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字段以及MyUser模型中的3个额外字段。

答案 1 :(得分:0)

这应该只是一个评论,但我没有足够的声誉来发表评论。

在我看来,您需要的是用户个人资料模型。 Here你可以看到它是如何完成的。请注意post_save.connect(...)电话。每次创建新用户时都需要自动创建新的个人资料,而这似乎正是您所缺少的。