django-tastypie - Как сделать многоточие через отношения

Я работаю над API для проекта, и у меня есть отношение Order/Products через OrderProducts следующим образом:

В каталоге/models.py

class Product(models.Model):
    ...

По порядку/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)
    ...

Теперь, когда я загружаю заказ через API, я также хочу получить соответствующие продукты, поэтому я попробовал это (с django-tastypie):

По порядку/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'

которые дают мне это сообщение об ошибке: «Объект« Продукт »не имеет атрибута« заказ »». Поэтому я не уверен, что не так или отсутствует, возможно, для этого также требуется что-то в моем ресурсе продукта, но я безуспешно пробовал несколько способов. Любая помощь приветствуется :)


person djevg    schedule 08.02.2012    source источник


Ответы (1)


Проблема в этой строке:

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

Ошибка довольно прямолинейна. Product действительно не имеет атрибута с именем order. Ваша таблица соединений OrderProduct делает это, но ваш M2M не возвращает OrderProducts, он возвращает Products.

person Chris Pratt    schedule 08.02.2012
comment
Я, вероятно, все еще что-то упускаю, но я не вижу, какое поле должен использовать ToOneField или что должен возвращать M2M? - person djevg; 08.02.2012
comment
Вам нужен ProductResource, а не OrderProductResource. Это твоя проблема. Это похоже на настройку M2M на самой модели. Вы не делаете models.ManyToManyField(OrderProduct); вы делаете models.ManyToManyField(Product). Здесь то же самое, вы создаете свой ToManyField со ссылкой на ProductResource, который возвращает Products. - person Chris Pratt; 08.02.2012
comment
Хорошо, понял ;) По некоторым причинам я думал, что мне нужно переопределить всю взаимосвязь внутри API, но это умнее… Спасибо за помощь. - person djevg; 08.02.2012
comment
Здравствуйте @djevg, вы смогли решить эту проблему? Можете ли вы опубликовать свое решение, если это так. Спасибо! - person dackyD; 30.10.2012