2010-12-30 5 views
7

Ich implementiere eine kleine E-Shop-Anwendung in Django. Meine Frage betrifft einen Auftrag mit vielen Orderlines Modellierung: wie man den Auftrag Orderlines Beziehung zu dem Orderlines zugänglich von der Bestellung direkt zu modellieren, dhDjango OneToMany

Order 
    def addOrderLine 
    def allOrderLines 

ich die Orderlines vom Auftrag zugreifen will und nicht müssen Holen Sie sie direkt von der db. Django bietet die Möglichkeit, Foreign zu definieren, aber das ist mein Problem nicht lösen, weil ich folgende definieren müss:

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

Mit dieser Definition würde ich die Orderlines direkt von der DB holen müssen und nicht durch den Orden.

Ich könnte diese Definition verwenden und Methoden auf der Ebene Order bereitstellen. Dies ist jedoch nicht funktioniert, weil, wenn ich die Order über dem OrderLine in der models.py Datei definieren, wird der Order nicht sehen die OrderLines

Antwort

6

Wenn ich das richtig verstehe, sind Sie für die Umkehrung der viele der Suche nach ein dh ein Accessor, der Ihnen einen Satz von allen orderlines pro order zur Verfügung stellt.

Zum Glück macht das Erstellen einer Viele-zu-Eins-Verbindung das für Sie. Versuchen Sie dies:

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

Zeilen sollten jetzt den gesamten Satz von verknüpften Bestellzeilen enthalten. Es scheint nicht umfassend dokumentiert zu sein, aber wenn Sie den Beispielcode in der many-to-one documentation genau lesen, werden Sie diese Funktionalität immer wieder sehen.

Hinweise:

  • Kleinbuchstaben orderline vorsätzliches ist, ist es immer Kleinschreibung.
+0

vielen Dank dieses perfekt beantwortet meine Frage! – paweloque

8

Sie möchten ein ForeignKey zu Order von . Etwas wie folgt aus:

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

Dies wird pretty well documented Verhalten :)