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