Django:如何对 OneToOneField 使用 select_related?

Django : How to use select_related for a OneToOneField?

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

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 %}

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

因为只有一个 child,我会删除 related_name='children',然后您将访问 parent.child 而不是 parent.children。 one-to-one 字段也不需要 unique=True

parent = models.OneToOneField(Parent)

然后,在您的模板中:

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

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