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

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函数解决此问题,但是由于
  在thisthis帖子中,我更倾向于放弃此解决方案。

最佳答案

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

10-01 03:40
查看更多