2012-02-08 6 views
7

Sto lavorando su un API per un progetto e ho un ordine di rapporto/Prodotti attraverso OrderProducts come questo:django-tastypie - Come rendere ManyToMany attraverso la relazione

In catalogo/models.py

class Product(models.Model): 
    ... 

per/models.py

class Order(models.Model): 
    products = models.ManyToManyField(Product, verbose_name='Products', through='OrderProducts') 
    ... 

class OrderProducts(models.Model): 
    order = models.ForeignKey(Order) 
    product = models.ForeignKey(Product) 
    ... 

Ora, quando carico un ordine attraverso l'API mi piacerebbe ottenere i relativi prodotti e, quindi ho provato questo (con django-tastypie):

Per/api.py

class OrderResource(ModelResource): 
    products = fields.ToManyField('order.api.OrderProductsResource', products, full=True) 

    class Meta: 
     queryset = Order.objects.all() 
     resource_name = 'order' 

class OrderProductsRessource(ModelResource): 
    order = fields.ToOneField(OrderResource, 'order') 

    class Meta: 
     queryset = OrderProducts.objects.all() 
     resource_name = 'order/products' 

che mi danno questo messaggio di errore: "oggetto 'prodotto' non ha attributo 'ordine'". Quindi non sono sicuro di cosa sia sbagliato o mancante, probabilmente richiede qualcosa anche nella mia risorsa Prodotto, ma ho provato in vari modi senza successo. Qualsiasi aiuto sarebbe benvenuto :)

risposta

2

Il problema è con questa linea:

order = fields.ToOneField(OrderResource, 'order') 

L'errore è abbastanza straight-forward. Product in realtà non ha un attributo denominato order. La tua tabella di join OrderProduct, ma il tuo M2M non restituisce OrderProduct s restituisce Product s.

+0

Probabilmente mi manca ancora qualcosa ma non vedo quale campo deve essere utilizzato da ToOneField o cosa dovrebbe restituire M2M? – djevg

+0

È necessario un 'ProductResource' non un 'OrderProductResource'. Questo è il tuo problema. È come impostare l'M2M sul modello stesso. Non si eseguono 'models.ManyToManyField (OrderProduct)'; fai 'models.ManyToManyField (Prodotto)'. È lo stesso qui, tu crei il tuo 'ToManyField' con un link ad un' ProductResource' che restituisce 'Product's. –

+0

Ok, ho capito;) Per alcune ragioni, ho pensato di dover ridefinire l'intera relazione all'interno dell'API ma è più intelligente di così ... Grazie per il tuo aiuto. – djevg