在 Django 中使用自定义字段扩展 django.contrib.auth.models.User 模型
Extending django.contrib.auth.models.User model with custom fields in Django
我将 Django 1.8.2 与 python 2.7.3、rest 框架和 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 正常
内容类型:application/json
变化:接受
允许:GET、HEAD、OPTIONS
{
"count": 0,
"next":空,
"previous":空,
"results": []
}
您没有正确扩展 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
字段以及 MyUser
模型中的 3 个额外字段。
这真的应该只是一条评论,但我没有足够的声誉 post 发表评论。
在我看来,您需要的是用户配置文件模型。 Here 你可以看到它是如何完成的。注意 post_save.connect(...)
调用。为了在每次创建新用户时自动创建新的配置文件,它是必需的,这似乎正是您所缺少的。
我将 Django 1.8.2 与 python 2.7.3、rest 框架和 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 正常 内容类型:application/json 变化:接受 允许:GET、HEAD、OPTIONS
{ "count": 0, "next":空, "previous":空, "results": [] }
您没有正确扩展 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
字段以及 MyUser
模型中的 3 个额外字段。
这真的应该只是一条评论,但我没有足够的声誉 post 发表评论。
在我看来,您需要的是用户配置文件模型。 Here 你可以看到它是如何完成的。注意 post_save.connect(...)
调用。为了在每次创建新用户时自动创建新的配置文件,它是必需的,这似乎正是您所缺少的。