2010-12-30 20 views
7

Sto implementando una piccola applicazione di e-shop in django. La mia domanda riguarda modellazione un Ordine con molti OrderLines: come modellare l'Ordine a OrderLines rapporto con i OrderLines accessibili direttamente dall'Ordine, vale a direDjango OneToMany

Order 
    def addOrderLine 
    def allOrderLines 

voglio accedere alle OrderLines dall'Ordine e non devono prendili direttamente dal db. Django offre la possibilità di definire ForeignKeys, ma questo non risolve il problema, perché avrei dovuto definire quanto segue:

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

Con questa definizione che avrei dovuto prendere i OrderLines direttamente dal db e non attraverso l'Ordine.

I'm potrebbe utilizzare questa definizione e fornire metodi sul livello Order. Questo, tuttavia, non funziona perché se io definisco il Order al di sopra del OrderLine nel file models.py, il Order non vede il OrderLines

risposta

6

Se ho capito bene che state cercando l'inverso di molti alla uno cioè un accessor che ti fornisce un insieme di tutti orderlines per order.

Fortunatamente, l'atto di creare un collegamento molti-a-uno fa questo per voi. Prova:

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

le righe ora dovrebbero contenere l'intero set di righe di ordine collegate. Non sembra essere ampiamente documentato, ma se leggi il codice di esempio nello many-to-one documentation da vicino, vedrai questa funzionalità usata sempre.

Note:

  • Minuscolo orderline è intenzionale, è comunque sempre inferiore.
+0

grazie mille risponde a questa perfettamente alla mia domanda! – paweloque

8

Si desidera un ForeignKey a Order da OrderLine. Qualcosa di simile a questo:

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>] 

Questo è pretty well documented comportamento :)