bifangback

django model:can't set attribute

2021-01-02  本文已影响0人  万州客

这次故障,源于一些可能会不注意的细节,作一次记录。

一,缘起

我建django model后,makemigration, migrate, admin register之类的命令,都是好好的。
但当我想在django admin管理后台新增一条记录时,显示如下错误:

AttributeError at /admin/cmdb/salttb/add/
can't set attribute
Request Method: GET
Request URL:    http://localhost:8000/admin/cmdb/salttb/add/
Django Version: 3.1.4
Exception Type: AttributeError
Exception Value:    
can't set attribute
Exception Location: D:\Code\bifang\bifangback\venv\lib\site-packages\django\db\models\base.py, line 486, in __init__
Python Executable:  D:\Code\bifang\bifangback\venv\Scripts\python.exe
Python Version: 3.8.6
Python Path:    
['D:\\Code\\bifang\\bifangback',
 'D:\\Python38\\python38.zip',
 'D:\\Python38\\DLLs',
 'D:\\Python38\\lib',
 'D:\\Python38',
 'D:\\Code\\bifang\\bifangback\\venv',
 'D:\\Code\\bifang\\bifangback\\venv\\lib\\site-packages']
Server time:    Sat, 02 Jan 2021 21:20:04 +0800
2021-01-02 21_15_34-AttributeError at _admin_cmdb_gittb_add_.png

二,解决

我试了一些自己的想像办法去解决,如更改表名,verbose_name,增加外键等,都不能解决。
但一条错误详细记录提醒了我。

_DEFERRED   
<Deferred field>
__class__   
<class 'django.db.models.base.Model'>
_setattr    
<built-in function setattr>
args    
()
cls 
<class 'cmdb.salt_models.SaltTb'>
field   
<django.db.models.fields.CharField: username>
fields_iter 
<tuple_iterator object at 0x00000151D2C98C70>
is_related_object   
False
kwargs  
{}
opts    
<Options for SaltTb>
self    
<SaltTb: >
val 
''
2021-01-02 21_44_39-AttributeError at _admin_cmdb_salttb_add_.png

<django.db.models.fields.CharField: username>
这个熟悉了。
上菜!!!
我的model定义,分两步合成。
a,抽象类

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

User = get_user_model()


class BaseModel(models.Model):
    name = models.CharField(max_length=100,
                            unique=True,
                            verbose_name="名称")
    description = models.CharField(max_length=100,
                                   null=True,
                                   blank=True,
                                   verbose_name="描述")
    create_user = models.ForeignKey(User,
                                    blank=True,
                                    null=True,
                                    on_delete=models.SET_NULL,
                                    verbose_name="用户")
    update_date = models.DateTimeField(auto_now=True)
    create_date = models.DateTimeField(auto_now_add=True)
    base_status = models.BooleanField(default=True)

    @property
    def username(self):
        return self.create_user.username

    def __str__(self):
        return self.name

    class Meta:
        abstract = True
        ordering = ('-update_date',)

b,继承类

from django.db import models
from .base_models import BaseModel


# Git代码仓库地址,有的公司可能有多个Git仓库
class GitTb(BaseModel):
    git_url = models.URLField(verbose_name="Git API地址")
    username = models.CharField(max_length=64, verbose_name="Git API用户")
    password = models.CharField(max_length=64, verbose_name="Git API密码")
    token = models.CharField(max_length=64, verbose_name="Git API认证token")
    git_ver = models.CharField(max_length=16, verbose_name="Git版本")

    class Meta:
        db_table = 'GitTb'
        verbose_name = 'GitTb代码仓库'
        verbose_name_plural = 'GitTb代码仓库'

看到了么?
baseModel里定义了username的property,而GitTb里也有这个username。
怪不得!!!!!!!!!
第二个username改名后,解决~~~~

上一篇下一篇

猜你喜欢

热点阅读