0

J'ai créé un modèle OneToOneField (parent) dans Child avec related_name='children'. Dans mes vues, j'ai utilisé select_related pour obtenir le jeu de requête. Mais dans ma page, la liste des enfants associés à un parent est vide.Django: Comment utiliser select_related pour un OneToOneField?

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) 

Modèle:

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

@Bobort, Merci, je l'ai changé – sumanth

Répondre

4

Il est un à un champ, vous accédez simplement parent.children (parce que vous avoir related_name='children') au lieu de boucler à travers parent.children.all().

Puisqu'il n'y a qu'un seul enfant, je supprimerais le related_name='children', alors vous aurez accès à parent.child au lieu de parent.children. Vous n'avez pas non plus besoin de unique=True pour un champ un-à-un.

parent = models.OneToOneField(Parent) 

Ensuite, dans votre modèle:

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

Notez que l'utilisation select_related ne change pas la façon dont vous accédez aux objets dans le modèle, il réduit seulement le nombre de requêtes SQL.