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

zoi*_*erg 18 django

我有一个Django应用程序,其中我的主模型具有其他数据库表的ForeignKey字段.

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...
Run Code Online (Sandbox Code Playgroud)

所有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
Run Code Online (Sandbox Code Playgroud)

在视图中,我运行的查询为:

    bugs = Bugs.objects.filter(active=True).order_by('priority__sortkey','bug_severity__sortke
Run Code Online (Sandbox Code Playgroud)

在模板中,我可以遍历它们,并正确显示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>
Run Code Online (Sandbox Code Playgroud)

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

我很确定原因是值只返回实际的数据库值,所以它不能跟随FK.

问题是,如何操作将数据发送到模板的数据,仍然遵循ForeignKey?

Mic*_*l B 33

我一直都在使用这种方法.你是对的.它只返回值,因此您必须使用"__"表示法从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
)
Run Code Online (Sandbox Code Playgroud)

现在,在您的模板中,您执行以下操作:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

这在底部附近的QuerySet.values()文档中有所介绍:

您还可以通过OneToOneField,ForeignKey和ManyToManyField属性引用相关模型上具有反向关系的字段:

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

  • 那很好。我发誓我已经十次阅读该Queryset.values()文档,试图弄清楚这一点,并且从未读过有关FK关系的底层内容。 (2认同)