django-tastypie и многие ко многим через отношения

В Django и Tastypie я пытаюсь выяснить, как правильно работать со «сквозными» отношениями «многие ко многим», например, найденными здесь: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

Вот мои примеры моделей:

class Ingredient(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

class RecipeIngredients(models.Model):
    recipe = models.ForeignKey('Recipe')
    ingredient = models.ForeignKey('Ingredient')
    weight = models.IntegerField(null = True, blank = True)

class Recipe(models.Model):
    title = models.CharField(max_length=100)
    ingredients = models.ManyToManyField(Ingredient, related_name='ingredients', through='RecipeIngredients', null = True, blank = True)

Теперь мой файл api.py:

class IngredientResource(ModelResource):
    ingredients = fields.ToOneField('RecipeResource', 'ingredients', full=True)

    class Meta:
        queryset = Ingredient.objects.all()
        resource_name = "ingredients"


class RecipeIngredientResource(ModelResource):
    ingredient = fields.ToOneField(IngredientResource, 'ingredients', full=True)
    recipe = fields.ToOneField('RecipeResource', 'recipe', full=True)

    class Meta:
        queryset= RecipeIngredients.objects.all()


class RecipeResource(ModelResource):
    ingredients = fields.ToManyField(RecipeIngredientResource, 'ingredients', full=True)

class Meta:
    queryset = Recipe.objects.all()
    resource_name = 'recipe'

Я пытаюсь основывать свой код на этом примере: http://pastebin.com/L7U5rKn9

К сожалению, с этим кодом я получаю эту ошибку:

"error_message": "'Ingredient' object has no attribute 'recipe'"

Кто-нибудь знает, что здесь происходит? Или как включить название ингредиента в RecipeIngredientResource? Спасибо!

РЕДАКТИРОВАТЬ:

Возможно, я сам нашел ошибку. ToManyField должен быть направлен на Ingredient, а не на RecipeIngredient. Я посмотрю, сработает ли это.

РЕДАКТИРОВАТЬ:

Новая ошибка .. есть идеи? Объект имеет пустой атрибут title и не допускает значение по умолчанию или нулевое значение.


person bento    schedule 17.05.2012    source источник


Ответы (2)


Ты упомянул:

Возможно, я сам нашел ошибку. ToManyField должен быть направлен на Ingredient, а не на RecipeIngredient. Я посмотрю, сработает ли это.

Однако есть лучший подход [Tastypie M2M](http://blog.eugene-yeo.in/django-tastypie-manytomany-through.html) (старый блог недоступен: https://github.com/9gix/eugene-yeo.in/blob/master/content/web/django-tastiepie-m2m.rst)

Короче говоря, вместо ToManyField для ингредиентов я использую ToManyField для ThroughModel. И настройте attribute kwargs как функцию обратного вызова, которая возвращает ThroughModel Queryset.

Обновление (апрель 2014 г.)

Этот ответ сделан давно. Не уверен, что это все еще полезно.

person Yeo    schedule 03.12.2012
comment
Пожалуйста, укажите важные моменты ответа здесь, в этом посте. Stack Overflow здесь не для того, чтобы быть хранилищем ссылок на вещи, а для того, чтобы быть хранилищем ответов. Это также очень неуместный способ продвижения вашего блога. - person Andrew Barber; 03.12.2012
comment
Ссылка, кажется, мертва в данный момент - person msc; 17.10.2013
comment
Ссылка все еще мертва, и я нигде не смог найти кешированную версию. - person Jay Taylor; 16.04.2014
comment
@JayTaylor, ссылка обновлена. Надеюсь, это поможет вам. Кстати, я больше не использую Tastypie, вместо этого я использую DjangoRestFramework (DRF). - person Yeo; 16.04.2014
comment
Можете ли вы опубликовать пример здесь, пожалуйста?? ссылка уже не работает - person psychok7; 23.10.2014
comment
@psychok7 Извините за неудобства github.com/9gix/eugene-yeo.in/blob/master/content/web/ - person Yeo; 25.10.2014
comment
эй @Yeo, позволит ли ваше решение мне POST/PATCH моих ресурсов без необходимости переопределять метод save_m2m() ?? Если нет, не могли бы вы предоставить мне пример того, как я могу этого добиться? Я боролся с этим уже несколько дней. Спасибо - person psychok7; 25.10.2014
comment
Если я не ошибаюсь, я не пробовал POST/PATCH для этих отношений. Уже много лет я не притрагиваюсь к Tastypie, мне жаль, что я не могу вам помочь. Тем не менее, было бы хорошо, если бы вы посмотрели, как DRF решает проблемы с POST PATCH на данный момент, надеюсь, это поможет. - person Yeo; 25.10.2014

У меня была такая же проблема, как у вас. Чтобы решить эту проблему, я просто удалил поле ToMany (как в RecipeResource) из API. Это сработало для нас, потому что модель по-прежнему имела поле manytomany (только не API), и вы все еще могли запрашивать отношение, вместо этого запрашивая промежуточную модель.

person lgunsch    schedule 05.06.2012
comment
Это на самом деле не отвечает на вопрос. - person fluffels; 30.10.2014