配置不正确:字段名称`地址`对于模型`User`

时间:2018-03-04 18:55:51

标签: django django-models django-rest-framework

我试图覆盖Djoser用户注册序列化程序,以向用户模型添加自定义字段。以下是我的models.py

from django.db import models


class User(models.Model):
    email = models.CharField(max_length=100, blank=False)
    first_name = models.CharField(max_length=100, blank=False)
    address = models.CharField(max_length=30, blank=True)
    password = models.CharField(max_length=100, blank=False)

和我的serializers.py看起来如下:

from djoser.serializers import UserCreateSerializer as BaseUserRegistrationSerializer


class UserRegistrationSerializer(BaseUserRegistrationSerializer):
    class Meta(BaseUserRegistrationSerializer.Meta):
        fields = ('url', 'id', 'email', 'first_name', 'address', 'password')

这是我的view.py

from User.models import User
from User.serializers import UserRegistrationSerializer
from rest_framework import viewsets


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserRegistrationSerializer

我已按照以下方式在setting.py中配置了Djoser配置

DJOSER = {
    'SERIALIZERS': {
        'user_create': 'User.serializers.UserRegistrationSerializer',
    },
}

尝试创建新用户时出现以下错误 enter image description here

我运行makemigration并进行迁移,但错误仍然存​​在。任何帮助表示赞赏:)

更新

我更改了我的模型文件。这是新的models.py

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


class Profile(models.Model):
    user = models.OneToOneField(User)
    address = models.CharField(max_length=30, blank=True)

现在我遇到了以下错误 enter image description here

2 个答案:

答案 0 :(得分:1)

正如@kshikama在他的回答中提到的,你不应该从django.conrib.auth.models.User继承用户模型。因此,您可以使用pip安装django-custom-userdjango-custom-user)并使用其AbstractUser模型。

此外,您正在使用djoser作为auth端点。而且您还重写了user_create序列化程序。所以我建议您不要为User Create制作自己的基于类的视图。只需覆盖djoser序列化程序(你已经完成)并使用它的endoint。

在你的网址中。只需包含djoser网址。

urlpatterns = [
    ...
    url(r'^api/auth/', include('djoser.urls')),
    ...
]

用户创建的Djoser端点是api/auth/users/create/。有关详细信息,请转到djoser docs

答案 1 :(得分:0)

Django已经定义了自己的User model。如果要向其添加地址字段,则需要对其进行扩展。我通常称之为扩展名" Profile"但你可以任意命名。

class Profile(Model):
    user = models.OneToOneField(User)
    address = models.CharField(max_length=30, blank=True)

编辑:正如Daniel Roseman在评论中所建议的那样。