Django:如何为OneToOneField使用select_related?

sum*_*nth 1 django django-models one-to-one django-views django-select-related

我在Child模型中创建了一个OneToOneField(父)related_name='children'.在我的观点中,我曾经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()
Run Code Online (Sandbox Code Playgroud)

views.py:

def live_prices(request):
    parent_queryset = Parent.objects.all().select_related('children')
    return render(request, 'live_prices.html', 'parent_queryset' : parent_queryset)
Run Code Online (Sandbox Code Playgroud)

模板:

{% for parent in parent_queryset %}
{% child in parent.children.all %}
{{ child.price }}
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 7

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

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

parent = models.OneToOneField(Parent)
Run Code Online (Sandbox Code Playgroud)

然后,在您的模板中:

{% for parent in parent_queryset %}
    {{ parent.child.price }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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