2010-04-25 58 views
3

如何測試以查看某個類是否包含特定屬性?如何測試以查看某個類是否包含特定屬性?

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'[email protected]', 
'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 

我有一個奇怪的錯誤,其中更多的屬性顯示比我實際定義。 我想有條件地停止這一點。

例如

if not hasattr(User, 'karma'): 
    User.add_to_class('karma', models.PositiveIntegerField(default=1)) 
+2

的Python遵循EAFP模式(更容易請求原諒比許可) - 地道的Python代碼不應該檢查屬性的存在,它應該簡單地假設它會在那裏。 – 2010-04-25 15:48:27

+0

關於EAFP的更多信息:http://docs.python.org/glossary.html#term-eafp – 2010-04-25 15:56:50

回答

9

據我所知,Django模型沒有像hasattr()這樣的方法。但是有一種方法可以檢查Django模型是否具有特定的字段。

爲了驗證這一點,我會建議您訪問的Django(Python)的外殼:

$> python manage.py shell 

現在導入的用戶模式:

$> from django.contrib.auth.models import User 

獲取模型的元信息:

$> opts = User._meta 

要檢查字段,請使用以下命令:

$> opts.get_field('username') 

在用戶模式存在的情況下,將打印出類似這樣的消息:

<django.db.models.fields.CharField object at 0x1024750> 

如果你正在尋找的字段不是模型FieldDoesNotExist會拋出的一部分。有了這些知識,你應該能夠以編程方式檢查字段的存在。

你可以閱讀更多有關在這裏:b-list.org: Working with models

7

我同意關於EAFP問題提出的意見,但反過來也有一些情況下,當你需要LBYL(三思而後行)。

由於Django的元類魔術意味着字段不包含在模型類'__dict__中,因此一般來說,Python類的方法不適用於Django模型。因此,專門爲Django模型,你可以這樣做有以下功能:

def django_model_has_field(model_class, field_name): 
    return field_name in model_class._meta.get_all_field_names() 
+0

以上不再是可用的解決方案 – Zargold 2017-02-07 21:18:50

1

User類有一個用戶名的屬性,因爲模型場由在初始化時元類添加。但是,您可以使用Model._meta.get_field(filename)來檢查模型是否定義了特定字段。

0

Django的1.10和更大(get_all_field_names被廢棄後):

def get_or_create_field(self, field_name, type):  
    if field_name not in [f.name for f in self._meta.get_fields()]: 
     self.add_to_class(field_name, type) 
    return self._meta.get_field(field_name) 
相關問題