【问题标题】:AttributeError : 'NoneType' object has no attribute '_meta'AttributeError:“NoneType”对象没有属性“_meta”
【发布时间】:2019-02-14 05:25:21
【问题描述】:

问题是我重写了 BaseUser 以允许访问者使用电子邮件和密码而不是 Django 默认用户名登录。除非我们引入序列化程序,否则代码工作正常。 如果我将用户对象传递给用户序列化器,它会给出

AttributeError : 'NoneType' 对象没有属性 '_meta'

以下是我的文件:

View.py

class Carrier(APIView):
def post(self, request, format='json'):      #create
    try:
        data = request.data
        print(data['domainID'])
        domain = Domain.objects.get(id = data['domainID'])
        print(domain)
        role   = UserRole.objects.get(id = data['roleID'])
        print(role)

        user_obj = User(
                                                        email       = data['email'],
                                                        domainID    = domain,
                                                        roleID      = role,
                                                        user_name   = data['user_name'],
                                                        phone       = data['phone']
                                                )  

        user_obj.set_password(data['password'])                                              
        user_obj.save()

        carr_obj = CarrierExtraInfo.objects.create(CustomUserID=user_obj,somevalue=data['CustomUserID']['somevalue'])        
        context = {
            "data": data['user_name'],
            "message": 'verify your account'
        }
        carr_obj.save()
        return Response(context, status=status.HTTP_200_OK)
    except Exception as e:
        context = {
            "data": str(e),
            "message": 'invalid details'
        }
        return Response(context,status=status.HTTP_400_BAD_REQUEST)

custom_user 模型

class User(AbstractBaseUser):
    objects = UserManager()
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )

    domainID    =  models.ForeignKey(Domain, on_delete = models.CASCADE, null=True,blank=True)
    roleID      =  models.ForeignKey(UserRole, on_delete = models.CASCADE, null=True,blank=True)
    user_name   =  models.CharField(max_length = 200,null=True,blank=True) 
    phone       =  models.CharField(max_length = 50,null=True,blank=True)
    is_verified =  models.BooleanField(default=False)
    active      =  models.BooleanField(default=True)
    staff       =  models.BooleanField(default=False) # a admin user; non super-user
    admin       =  models.BooleanField(default=False) # a superuser
    created_DT  =  models.DateTimeField(auto_now_add=True)
    updated_DT  =  models.DateTimeField(auto_now=True)

运营商模式

class CarrierExtraInfo(models.Model):
    CustomUserID  = models.OneToOneField(User,on_delete=models.CASCADE,null=True,blank=True)
    somevalue     = models.CharField(max_length=100,null=True,blank=True)
    is_active     = models.BooleanField(default=True)


    created_DT    = models.DateTimeField(auto_now_add=True)
    updated_DT    = models.DateTimeField(auto_now=True)

custom_user 序列化程序

class CreateCarrierSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('email','domainID','roleID','user_name','phone')

载体序列化器

class CarrierExtraInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = CarrierExtraInfo
        exclude = ('created_DT','updated_DT')

输出错误

File "E:\KargoLogic\venv\lib\site-packages\rest_framework\serializers.py", line 370, in _writable_fields
  field for field in self.fields.values() if not field.read_only 
File "E:\KargoLogic\venv\lib\site-packages\rest_framework\serializers.py", line 363, in fields
  for key, value in self.get_fields().items(): 
File "E:\KargoLogic\venv\lib\site-packages\rest_framework\serializers.py", line 1024, in get_fields
  info = model_meta.get_field_info(model) 
File "E:\KargoLogic\venv\lib\site-packages\rest_framework\utils\model_meta.py", line 39, in get_field_info
  forward_relations = _get_forward_relationships(opts) 
File "E:\KargoLogic\venv\lib\site-packages\rest_framework\utils\model_meta.py", line 96, in _get_forward_relationships
  not field.remote_field.through._meta.auto_created
AttributeError: 'NoneType' object has no attribute '_meta'

"POST /carr/api/carr_user HTTP/1.1" 500 16718

为什么我会得到这个? 迁移时没有错误,但在 POST 请求时出现此错误。

【问题讨论】:

  • 发表你的看法

标签: python django serialization django-rest-framework deserialization


【解决方案1】:

当您拥有自定义 Django 用户模型时,请确保您在启动用户 (From the Django Docs) 的文件中正确导入它。因此,将以下内容添加到您的 serializers.py 文件的顶部。这为我解决了同样的错误。

from django.contrib.auth import get_user_model

User = get_user_model()

【讨论】:

    【解决方案2】:

    缩进不正确

    class CreateCarrierSerializer(serializers.ModelSerializer):
         class Meta:
            model = User
            fields = ('email','domainID','roleID','user_name','phone')
    

    【讨论】:

    • 发表你的看法
    • 对后期恢复的请求。我已将我的视图文件添加到原始问题中。
    【解决方案3】:

    您还必须更新导入,以便它们指向您的新自定义用户模型。

    【讨论】:

    • 这看起来更像是评论而不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2017-07-13
    • 1970-01-01
    • 2023-01-20
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多