通过@property中的字段列表获取相关对象的值

我有两个具有以下字段的模型:

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函数解决此问题,但是由于   在user's home directorythis帖子中,我宁愿放弃此解决方案。

mnn1987 回答:通过@property中的字段列表获取相关对象的值

我不会让Profile在同辈的内部混乱,而是给每个类一个is_complete属性(或方法),该属性(或方法)确定实例是否完整,并具有{{1} }访问这些属性,以确定配置文件是否完整。

这样的东西(未经测试)

Profile.is_complete_profile

如果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无需更改,并且如果将其他对象添加到“完整性”的概念中,则只需进行最小的更改。

,

您收到此错误,因为您的Profile对象确实没有address.postal_code属性。它具有地址属性,并且address具有postal_code属性。

您可以通过简单的技巧来完成此操作:

@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
本文链接:https://www.f2er.com/3107916.html

大家都在问