<p>我假设您希望遍历字段,并选择要专门处理的外键:</p>
<pre><code>from django.db import models
# Get field_name, is_foreign_key pairs from model meta
fields_foreign = [(
field.name,
isinstance(field, models.ForeignKey)
) for field in Contact._meta.fields]
# Assume every related model has a 'name' field,
# if you want to get 'name' fields of these models,
# construct the list of field names to pass to values():
# something like ['url', 'email', 'person', 'bonus_field__name']
value_fields = [
f[0] if not f[1] else "{}__name".format(f[0])
for f in fields_foreign
]
# Now get the values
Contact.objects.values(*value_fields)
</code></pre>
<p>如果所说的“实际数据”,是指<code>__str__</code>返回的字符串:</p>
^{pr2}$
<p>如果希望获得更好的性能,在查询所有联系人对象时,最好对相关模型使用select_related()。在</p>
<p>关于选项,Django为每个有选项的字段提供了一个方便的方法get_field_display()。要在值列表中使用此选项,首先必须知道哪些字段设置了选项:</p>
<pre><code># Now we have tuples (field_name, is_field_foreign, field_has_choices)
fields_foreign_choices = [(
field.name,
isinstance(field, models.ForeignKey),
bool(field.choices)
) for field in Contact._meta.fields]
# We can use the magic get_field_display() method
contacts = Contact.objects.all()
for contact in contacts:
values = []
for f in fields_foreign_choices:
value = getattr(contact, f[0])
if f[1]: # Foreignkey, call str() on the model object
value = str(value) # this calls __str__ in model
elif f[2]: # The field has choices
display_method = getattr(contact, "get_{}_display".format(f[0])
value = display_method()
values.append(value)
print values
</code></pre>
<p>对于像Datetime字段这样的其他字段,您可以执行相同的操作:提取meta,并相应地进行转换。在</p>