Django:如何为OneToOneField使用select_related?

时间:2016-08-01 14:50:39

标签: django django-models django-views one-to-one django-select-related

我在Child模型中使用related_name='children'创建了OneToOneField(父级)。在我的观看中,我使用select_related来获取查询集。但是在我的页面中,与父项关联的子项列表显示为空。

Models.py:

class Parent(models.Model):
    item = models.CharField(max_length=20)

class Child(models.Model):
    parent = models.OneToOneField(Parent, unique = True, related_name = 'children')
    price = models.IntegerField()

views.py:

def live_prices(request):
    parent_queryset = Parent.objects.all().select_related('children')
    return render(request, 'live_prices.html', 'parent_queryset' : parent_queryset)

模板:

{% for parent in parent_queryset %}
{% child in parent.children.all %}
{{ child.price }}
{% endfor %}
{% endfor %}

1 个答案:

答案 0 :(得分:7)

这是一对一的字段,因此您只需访问parent.children(因为您拥有related_name='children'),而不是循环浏览parent.children.all()

由于只有一个孩子,我会删除related_name='children',然后您将访问parent.child而不是parent.children。对于一对一字段,您也不需要unique=True

parent = models.OneToOneField(Parent)

然后,在您的模板中:

{% for parent in parent_queryset %}
    {{ parent.child.price }}
{% endfor %}

请注意,使用select_related不会改变您访问模板中对象的方式,只会减少SQL查询的数量。