Python 通过@property中的字段列表获取相关对象的值
我有两个这样的模型,具有以下字段:Python 通过@property中的字段列表获取相关对象的值,python,django,oop,django-models,Python,Django,Oop,Django Models,我有两个这样的模型,具有以下字段: Profile: -user(OTO Relation to User) -address(OTO to Address) -bio -gender ... Address: -postal_code -phone_number -zip_code 我还有以下字段名称列表: my_list = ["bio","gender","address.postal_code","address.p
Profile:
-user(OTO Relation to User)
-address(OTO to Address)
-bio
-gender
...
Address:
-postal_code
-phone_number
-zip_code
我还有以下字段名称列表:
my_list = ["bio","gender","address.postal_code","address.phone_number", "address.zip_code"]
最后,我想创建这个@属性
:
@property
def is_complete_profile(self):
''' Checks if all the fields have been filled '''
if self.pk:
for field_name in my_list:
value = getattr(self,field_name)
if not value:
return False
return True
else:
return False
但是对于相关对象
这不是正确的方法,我得到了以下错误:
“配置文件”对象没有“地址.邮政编码”属性
如何使用此列表获取Profile
对象字段的值和相关对象值?
注意:
我可以通过使用eval
函数来解决这个问题,但是因为
在这篇文章中,我更愿意扔掉这个解决方案
与其让
Profile
在它的同级成员的内部活动,我将为每个涉及的类提供一个is\u complete
属性(或方法),该属性确定实例是否完整,并具有Profile。is\u complete\u Profile
访问这些属性以确定概要文件是否完全完整
类似这样的东西(未经测试)
这样,如果
地址
字段的名称发生更改,则不需要更改配置文件
,如果在“完整性”概念中添加了其他对象,则只需要进行最小的更改 出现此错误是因为您的配置文件
对象实际上没有地址.邮政编码
属性。它具有地址属性,而地址
具有邮政编码
属性
您可以通过一个简单的技巧来实现这一点:
@property
def is_complete_profile(self):
''' Checks if all the fields have been filled '''
if self.pk:
for field_name in my_list:
if '.' in field_name:
value = getattr(getattr(self, field_name.split('.')[0]), field_name.split('.')[1])
else:
value = getattr(self,field_name)
if not value:
return False
return True
else:
return False
回答得好@pedram parsian。我对你的答案投了赞成票。但我认为蛇魔法师的答案更好。请原谅我不能同时接受这两个答案。
@property
def is_complete_profile(self):
''' Checks if all the fields have been filled '''
if self.pk:
for field_name in my_list:
if '.' in field_name:
value = getattr(getattr(self, field_name.split('.')[0]), field_name.split('.')[1])
else:
value = getattr(self,field_name)
if not value:
return False
return True
else:
return False