【问题标题】:Extending django.contrib.auth.models.User model with custom fields in Django在 Django 中使用自定义字段扩展 django.contrib.auth.models.User 模型
【发布时间】:2015-10-11 06:35:51
【问题描述】:

我将 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 正常 内容类型:应用程序/json 变化:接受 允许:GET、HEAD、OPTIONS

{ “计数”:0, “下一个”:空, “上一个”:空, “结果”: [] }

【问题讨论】:

  • 您为什么要通过 OneToOne 字段进行操作? docs.djangoproject.com/en/1.8/topics/auth/customizing/… ...如果您使用 onetoone 方法,则无法直接访问基本模型上的字段(例如 username),听起来您当前正在创建 django auth User 而没有创建关联的 @987654328 @
  • 因为我正在尝试获取用户的字段。我应该从 AbstractBaseUser 继承吗? AbstractBaseUser ?
  • 是的,改为扩展AbstractUser,它会让一切变得更容易。记得设置AUTH_USER_MODEL设置docs.djangoproject.com/en/1.8/topics/auth/customizing/…

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


【解决方案1】:

您没有正确扩展User 模型。

要使用您的额外字段扩展User 模型,我们可以使用AbstractUser 模型。这将为我提供所有User 字段,例如usernameemail 等。现在,我们可以在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 个额外字段。

【讨论】:

  • 我仍然得到一个空的 json: { "count": 0, "next": null, "previous": null, "results": [] }
  • 数据库中是否存在任何对象,因为现在您已经更改了模型。 db 中似乎没有对象。
  • 终于成功了,我在设置中添加了 AUTH_USER_MODEL ='myapp.Myuser' 并删除并重新创建了数据库,谢谢
【解决方案2】:

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

在我看来,您需要的是用户配置文件模型。 Here 你可以看到它是如何完成的。注意post_save.connect(...) 调用。每次创建新用户时,为了自动创建新的配置文件,它是必需的,而这似乎正是您所缺少的。

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 2013-08-03
    • 2012-05-01
    • 2014-02-23
    • 1970-01-01
    • 2014-09-06
    • 2011-07-14
    相关资源
    最近更新 更多