Python 用于相关模型的Django getattr()

Python 用于相关模型的Django getattr(),python,django,Python,Django,我在django项目中有一个人物类: class People(models.Model): user = models.OneToOneField(User, unique=True) adress = models.CharField(max_length=500) def __unicode__(self): return "%s %s" % (self.user.first_name, self.user.last_name)

我在django项目中有一个人物类:

class People(models.Model):
   user        = models.OneToOneField(User, unique=True)
   adress      = models.CharField(max_length=500)

   def __unicode__(self):
    return "%s %s" % (self.user.first_name, self.user.last_name) 
   def get_all_fields(self):
    return self._meta.fields + self.user._meta.fields
我创建了一个视图,将模型从django数据库导出到csv文件中。 当然,也可以导出相关模型的信息,例如django用户

但当我在我的人民名单上循环时

people = People.objects.all()

for p in people:
row = ""
for field in p.get_all_fields():
     row     += str(getattr(p, field.name)) + ','
我收到错误:“People”对象没有“password”属性 当然没有,但是如何使用与“人”相关的外来对象获得getattr()的通知呢

编辑

我最终通过在类中使用一些附加函数编写了一个小的变通方法

class People(models.Model):
   user        = models.OneToOneField(User, unique=True)
   adress      = models.CharField(max_length=500)

   def __unicode__(self):
      return "%s %s" % (self.user.first_name, self.user.last_name) 

   def get_all_fields(self):
      return self._meta.fields + self.user._meta.fields

   def get_attribute(self, field_name):
      name_list = self.get_field_names()
      if field_name in name_list:
        return unicode(getattr(self, field_name))
      else:
        return unicode(getattr(self.user, field_name))

   def get_field_names(self):
      name_list   = []
      for field in self._meta.fields:
        name_list.append(field.name)
      return name_list

也许您可以将此混音添加到您的People类中:

class GetNestedFieldsMixin(object):
    link_fields = set((u"ForeignKey", u"OneToOneField"))

    @classmethod
    def _get_nested_fields(cls, obj):
        for field in obj._meta.fields:
            value = field.value_from_object(obj)
            is_link = field.get_internal_type() in cls.link_fields
            if is_link:
                nested_obj = field.rel.to.objects.get(pk=value)
                for name, field, value in  cls._get_nested_fields(nested_obj):
                    yield name, field, value
            else:
                yield obj._meta.object_name, field.name, \
                    field.value_to_string(obj)

    def get_nested_fields(self):
        return self._get_nested_fields(self)

class People(GetNestedFieldsMixin, models.Model):
    ...

for p in people:
    for model_name, field, value in p.get_nested_fields():
        print(model_name, field, value)

如果人数越来越多,您应该使用。选择_related以避免在内部循环中查询数据库。链接字段可能不正确。这只是给你一个想法:)。

你应该在“获取所有”字段(self)中返回一个列表,还应该在课堂上定义元数据。谢谢你的回答。这让我在编辑中想到了这个想法。不幸的是,它不是很方便,必须为所有可导出类添加它,这些类基本上是我的大多数类。不是所有类,只是一个你想要开始导出的类。它将为您提供所有与人相关的字段名和值,而不仅仅是人和用户。也许我不明白你的问题。如果您只想打印出附加的用户属性,则不需要解决方案,因为这很简单。我正在搜索一个通用函数,该函数遵循模型上的外键关系,用于根据实例的字段名获取其属性。因为我没有发现,所以我自己实现了一个基本函数。