2010-12-30 6 views
7

Je suis en train d'implémenter une petite application e-shop dans django. Ma question modélisation concerne un ordre avec beaucoup de OrderLines: Comment modéliser l'Ordre OrderLines relation avec les OrderLines accessibles directement à partir de l'Ordre, à savoirDjango OneToMany

Order 
    def addOrderLine 
    def allOrderLines 

Je veux accéder aux OrderLines de l'ordre et ne pas avoir à les obtenir directement depuis le db. Django offre la possibilité de définir ForeignKeys, mais cela ne résout pas mon problème, parce que je dois définir les éléments suivants:

class OrderLine(models.Model): 
    order = models.ForeignKey(Order) 

Avec cette définition, je dois chercher les OrderLines directement à partir du db et pas à travers l'Ordre.

Je pourrais utiliser cette définition et fournir des méthodes au niveau Order. Cependant, cela ne fonctionne pas parce que si je définis le Order au-dessus du OrderLine dans le fichier models.py, le Order ne voit pas le OrderLines

Répondre

6

Si je comprends bien, vous cherchez l'inverse du nombre de un par exemple un accesseur qui vous fournit un ensemble de tous orderlines par order. Heureusement, le fait de créer un lien plusieurs-à-un le fait pour vous. Essayez ceci:

o = Order.objects.get(id=X) 
lines = o.orderline_set.all() 

lignes devraient maintenant contenir l'ensemble des lignes de commande liées. Il ne semble pas être largement documenté, mais si vous lisez attentivement le code d'exemple dans le many-to-one documentation, vous verrez cette fonctionnalité utilisée tout le temps.

Notes:

  • Minuscules orderline est délibérée, il est toujours en minuscules.
+0

merci beaucoup cela répond parfaitement à ma question! – paweloque

8

Vous souhaitez un ForeignKey à Order à partir de OrderLine. Quelque chose comme ceci:

from django.db import models 

class Order(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 

class OrderLine(models.Model): 
    order = models.ForeignKey(Order, related_name='orderlines') 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.name 

# Create a new order in the DB: 
>>> order = Order.objects.create() 
# Add a few items to this order: 
>>> order.orderlines.create(name='Candied Yams') 
<Candied Yams> 
>>> order.orderlines.create(name='Minty loin of Lamb') 
<Minty loin of Lamb> 
# Get all items for this order: 
>>> order.orderitems.all() 
[<Candied Yams>, <Minty loin of Lamb>] 

Ce comportement est pretty well documented :)