首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试类是否包含特定属性?

如何测试类是否包含特定属性?
EN

Stack Overflow用户
提问于 2010-04-25 23:42:50
回答 4查看 3.8K关注 0票数 3

如何测试类是否包含特定属性?

代码语言:javascript
复制
In [14]: user = User.objects.get(pk=2)  

In [18]: user.__dict__  
Out[18]:   
{'date_joined': datetime.datetime(2010, 3, 17, 15, 20, 45),  
 'email': u'IloveDick@nwo.gov',  
 'first_name': u'',  
 'id': 2L,  
 'is_active': 1,  
 'is_staff': 0,  
 'is_superuser': 0,  
 'last_login': datetime.datetime(2010, 3, 17, 16, 15, 35),  
 'last_name': u'',  
 'password': u'sha1$44a2055f5',  
 'username': u'DickCheney'}  

In [25]: hasattr(user, 'username')  
Out[25]: True  

In [26]: hasattr(User, 'username')  
Out[26]: False  

我遇到了一个奇怪的bug,出现的属性比我实际定义的要多。我想有条件地停止这一切。

例如:

代码语言:javascript
复制
if not hasattr(User, 'karma'):
  User.add_to_class('karma', models.PositiveIntegerField(default=1)) 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-26 00:02:53

据我所知,对于Django模型,没有像hasattr()这样的方法。但是有一种方法可以检查Django模型是否具有特定的字段。

为了测试这一点,我建议您访问Django (Python) shell:

代码语言:javascript
复制
$> python manage.py shell

现在导入用户模型:

代码语言:javascript
复制
$> from django.contrib.auth.models import User

获取模型的元信息:

代码语言:javascript
复制
$> opts = User._meta

要检查字段,请使用以下命令:

代码语言:javascript
复制
$> opts.get_field('username')

在用户模型的情况下,将打印出如下消息:

代码语言:javascript
复制
<django.db.models.fields.CharField object at 0x1024750>

如果您要查找的字段不是模型的一部分,则将抛出FieldDoesNotExist。有了这些知识,您应该能够以编程方式检查字段的存在。

你可以在这里阅读更多关于它的内容:b-list.org: Working with models

票数 9
EN

Stack Overflow用户

发布于 2010-04-26 00:10:28

我同意问题中关于EAFP的评论,但相反,在某些情况下,您需要LBYL (三思而后行)。

一般来说,Python类的方法不适用于Django模型,因为Django的元类魔术意味着字段不包含在模型类的__dict__中。因此,对于Django模型,您可以执行类似以下函数的操作:

代码语言:javascript
复制
def django_model_has_field(model_class, field_name):
    return field_name in model_class._meta.get_all_field_names()
票数 7
EN

Stack Overflow用户

发布于 2010-04-26 00:13:50

User类没有username属性,因为模型字段是由元类在初始化时添加的。但是您可以使用Model._meta.get_field(filename)检查模型是否定义了特定的字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2708781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档