Django:使用 objects.values() 并在模板中获取外键数据

标签 django

我有一个 Django 应用程序,其中我的主模型具有指向其他数据库表的外键字段。

class Bugs(models.Model):
    bug_id = models.PositiveIntegerField(primary_key=True)
    bug_severity = models.ForeignKey(Bug_severity,null=True)
    priority = models.ForeignKey(Priority,null=True)
    bug_status = models.ForeignKey(Bug_Status,null=True)
    resolution = models.ForeignKey(Resolution,null=True)
    etc...

所有的 ForeignKey 表都有一个 unicode 函数,它返回我想在模板中显示的名称。
class Priority(models.Model):
    value = models.CharField(max_length=64)
    sortkey = models.PositiveSmallIntegerField()
    isactive = models.NullBooleanField()
    visibility_value_id = models.SmallIntegerField(null=True,blank=True)

    def __unicode__(self):
        return self.value

在 View 中,我将查询运行为:
    bugs = Bugs.objects.filter(active=True).order_by('priority__sortkey','bug_severity__sortke

在模板中,我可以遍历它们,并正确显示 ForeignKey 值。
{% for bug in bugs %}
   <tr class="bugrow" >
   <td>{{bug.bug_id}}</td>
   <td>{{bug.priority}}</td>
   <td>{{bug.bug_severity}}</td>
   <td>{{bug.bug_status}}</td>
   <td>{{bug.resolution}}</td>

我遇到的问题是我需要在将 Bugs 数据发送到模板之前对其进行操作,因此我使用 values() 方法返回一个字典。当我将该字典传递给模板时,它不会显示任何指向外键的字段。

我很确定原因是这些值只返回实际的数据库值,所以它不能遵循 FK。

问题是,我如何操作将其发送到模板的数据,并且仍然遵循外键?

最佳答案

我一直在使用这种方法。你是对的。它只返回值,因此您必须使用“__”符号从 ForeignKey 获取值。例如:

# Get all of the bugs
bugs = Bugs.objects.filter(
    active=True,
).order_by(
    'priority__sortkey',
    'bug_severity__sortkey',
).values(
    'bug_id',
    'priority', # Only the pk (id) of the bug priority FK
    'priority__value', # Equal to bug.priority.value
    'bug_severity',
    'bug_severity__some_value', # Equal to bug.priority.some_value
)

现在,在您的模板中,您可以:
{% for bug in bugs %}
    <tr class="bugrow">
        <td>{{ bug.bug_id }}</td>
        <td>{{ bug.priority }}</td>
        <td>{{ bug.priority__value }}</td>
        <td>{{ bug.bug_severity }}</td>
        <td>{{ bug.bug_severity__some_value }}</td>
    </tr>
{% endfor %}

这在 QuerySet.values() documentation 中有介绍,靠近底部:

You can also refer to fields on related models with reverse relations through OneToOneField, ForeignKey and ManyToManyField attributes:


Blog.objects.values('name', 'entry__headline')
[{'name': 'My blog', 'entry__headline': 'An entry'},
 {'name': 'My blog', 'entry__headline': 'Another entry'}, ...]

关于Django:使用 objects.values() 并在模板中获取外键数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27180190/

相关文章:

django - Memcache/Redis 的单独服务器?

python - Django:保存相关对象后执行操作

django - 将输出打印到 Django 网页

python - 请提供引擎值 Django 数据库配置

python - Django 基于类的 View 和继承

python - 通过Django应用程序中的音频标签播放音频

Python/Django Rest Framework 奇怪的错误仅在使用调试器时发生

sql-server - Python - pyodbc 使用参数名称调用存储过程

Python JSON 提取

Django - 使用大型静态数据表进行测试