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