pracuję nad API dla projektu i mam relacjami Order/produktów poprzez OrderProducts tak:django-tastypie: Delegowanie do zasobu mającego dziedzinie ManytoMany z pośrednictwem relacji
W models.py
class Product(models.Model):
...
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 zamówieniu/api.py
class OrderResource(ModelResource):
products = fields.ToManyField('order.api.ProductResource', products, full=True)
class Meta:
queryset = Order.objects.all()
resource_name = 'order'
Wszystko działa na liście Zamów zasoby. Dostaję zasoby zamówień z osadzonymi danymi produktu.
Problem polega na tym, że nie mogę tworzyć ani edytować obiektów zamówienia za pomocą api. Ponieważ używam modelu Through w relacji ManytoMany, produkty ManyToManyField (products) nie mają metod .add(). Ale tastypie próbuje wywołać .add() na polu produktów w OrderResource podczas wysyłania/umieszczania w nim danych.
{"error_message": "'ManyRelatedManager' object has no attribute 'add'", "traceback": "Traceback (most recent call last):\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 397, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1165, in post_list\n updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1784, in obj_create\n self.save_m2m(m2m_bundle)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1954, in save_m2m\n related_mngr.add(*related_objs)\n\nAttributeError: 'ManyRelatedManager' object has no attribute 'add'\n"}
To pytanie może Ci pomóc: http://stackoverflow.com/questions/10629047/django-tastypie-and-many-to-many-through-relationships – msc