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改名后,解决~~~~