我有两个具有以下字段的模型:
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
:@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
但是对于
related objects
,这不是正确的方法,并且出现了以下错误:“配置文件”对象没有属性“ address.postal_code”
如何使用此列表获取
Profile
对象的字段值和相关的对象值?注意:
我可以使用
eval
函数解决此问题,但是由于在this和this帖子中,我更倾向于放弃此解决方案。
最佳答案
我要让每个类都包含一个Profile
属性(或方法),该实例确定实例是否完整,并让is_complete
访问这些属性以确定配置文件,而不是在同级的内部查看内容。完全完成。
像这样(未经测试)
class Address:
def is_complete(self):
fields = ["postal_code", "phone_number", "zip_code"]
for field in fields:
if not getattr(self, field):
return False
return True
class Profile:
def is_complete(self):
fields = ["bio","gender"]
for field in fields:
if not getattr(self, field):
return False
return True
@property
def is_complete_profile(self):
''' Checks if all the fields have been filled '''
if self.pk:
return self.is_complete() and self.address.is_complete()
return False
这样,如果
Profile.is_complete_profile
的字段名称发生更改,则Profile
无需更改,并且如果将其他对象添加到“完整性”概念中,则只需进行最小的更改。