django 中model踩的坑之AttributeError: type object ** has no attribute ‘objects’及Field defines a relation with model **, which is either not installed, or is abstract.
1. AttributeError: type object ** has no attribute ‘objects’
作者目前使用的是django1.8.1版本,在一次新项目的启动中,在编译查询代码的时候(如下),总是抛出如上错误。有人告诉我那就自己在model中重新引入objects,即objects = Model.manager(),然而问题依然没有得到解决。
queryset = CompanyAuthRecord.objects.all()
最后发现原来把abstract = True注释掉就可以完美的解决这个问题,至于当初为什么会加这一属性,好像是在引入此model的时候,总是引入不成功,也是被别人告诉加入此属性就可以了。事实确实解决那个引入问题,然而当初并没有去研究为什么要用他,应了那句话:欠下的,迟早要还!
class CompanyAuthRecord(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, db_column='c_id')
company_seal = models.OneToOneField(CompanySeal, verbose_name='企业印章id', null=True,
db_column='c_company_seal_id')
add_by_id = models.UUIDField(verbose_name='添加人id', db_column='c_add_by_id', null=True, default=None)
add_dt = models.DateTimeField('添加时间', db_column='c_add_dt', auto_now_add=True)
class Meta:
db_table = 't_company_auth_record'
verbose_name = '企业认证状态记录表'
# abstract = True
ordering = ["add_dt"]
default_permissions = ()
附关于abstract=True的官方解释:
2.Field defines a relation with model **, which is either not installed, or is abstract.
解决了上述问题后,又有这样的问题出现,难道真要上演程序员修水管的景象?几经周折,原因又出现在被关联model的app_lable =’seal’属性上,如下注释即可解决问题。至于原因:django要求是这样的,你可以不设置这个参数,如果要设置请与你的app名称保持一致。而我就是犯了这样的错误。
class CompanySeal(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, db_column='c_id')
add_by_id = models.UUIDField(verbose_name=u'添加人id', db_column='c_add_by_id', null=True, default=None)
add_dt = models.DateTimeField(verbose_name=u'添加时间', db_column='c_add_dt', auto_now_add=True)
class Meta:
# app_label = 'seal'
db_table = 't_company_seal'
verbose_name = '企业电子印章数据表'
ordering = ["add_dt"]
default_permissions = ()
以上经验希望能帮到出现同样问题的你,问题其实本身不算问题,只怪我们太low,多看文档和源码才是提升之道。附关于Meta属性文档链接。
版权声明:本文为weixin_42813985原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。