2010-12-30 21 views
7

Estoy implementando una pequeña aplicación de e-shop en django. Mi pregunta se refiere a que modelan una Orden con muchas OrderLines: cómo modelar la Orden de OrderLines relación con los OrderLines accesibles directamente de la Orden, es decirDjango OneToMany

Order 
    def addOrderLine 
    def allOrderLines 

Quiero tener acceso a los OrderLines de la orden y no tener que obtenerlos de la base de datos directamente. Django ofrece la posibilidad de definir ForeignKeys, pero esto no resuelve mi problema, ya que tendría que definir lo siguiente:

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

Con esta definición tendría que buscar a los OrderLines directamente desde el PP y no a través de la Orden.

Podría utilizar esta definición y proporcionar métodos en el nivel Order. Esto, sin embargo, no funciona porque si defino la Order por encima de la OrderLine en el archivo models.py, la Order no ve la OrderLines

Respuesta

6

Si entiendo esto correctamente lo que buscas es la inversa de la que muchos es decir, un descriptor de acceso que le proporciona un conjunto de todos orderlines por order.

Afortunadamente, el acto de crear un enlace de varios a uno hace esto por usted. Pruebe esto:

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

Las líneas ahora deberían contener todo el conjunto de líneas de orden vinculadas. No parece estar ampliamente documentado, pero si lee el código de ejemplo en el many-to-one documentation de cerca, verá que esta funcionalidad se usa todo el tiempo.

Notas:

  • Minúsculas orderline es deliberado, es siempre en minúsculas.
+0

muchas gracias responde a esta perfectamente mi pregunta! – paweloque

8

¿Quieres una ForeignKey-Order de OrderLine. Algo como esto:

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

Esto se pretty well documented comportamiento :)

Cuestiones relacionadas