2012-02-08 10 views
7

pracuję nad API dla projektu i mam relacjami Order/produktów poprzez OrderProducts tak:django-tastypie - Jak zrobić manytomany przez związek

W katalogu/models.py

class Product(models.Model): 
    ... 

W zamówieniu/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) 
    ... 

teraz, kiedy załadować zamówieniu przez API chciałbym uzyskać related Products, tak więc to próbowałem (z django tastypie):

W celu/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' 

który daje mi ten komunikat o błędzie: "obiekt 'produkt' ma atrybut 'zamów'". Nie jestem więc pewien, co jest nie tak lub brakuje jej, to prawdopodobnie wymaga czegoś w moim zasobie produktu, ale próbowałem na kilka sposobów bez powodzenia. Każda pomoc będzie mile widziane :)

Odpowiedz

2

Problem jest z tej linii:

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

Błąd jest dość prosta. Product naprawdę nie ma atrybutu o nazwie order. Twoja tabela łączenia OrderProduct ma, ale twój M2M nie zwraca OrderProduct s zwraca Product s.

+0

Prawdopodobnie nadal brakuje mi czegoś, ale nie widzę, do jakiego pola ma używać ToOneField lub do czego ma powrócić M2M? – djevg

+0

Potrzebujesz 'ProductResource', a nie' OrderProductResource'. To Twój problem. To tak, jak konfigurowanie M2M na samym modelu. Nie wykonujesz 'models.ManyToManyField (OrderProduct)'; robisz 'models.ManyToManyField (Product)'. To samo tutaj, tworzysz 'ToManyField' z linkiem do' ProductResource', który zwraca 'Product's. –

+0

Ok, rozumiem;) Z pewnych powodów myślałem, że muszę przedefiniować całą relację w API, ale jest to mądrzejsze ... Dzięki za pomoc. – djevg