django-tastypie and many to many “through” relationships

Обновить

December 2018

Просмотры

5.7k раз

7

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

Вот мои выборочные модели:

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 должны быть направлены ингредиент и не RecipeIngredient. Я буду видеть, если это делает работу.

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

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

2 ответы

3

Ты упомянул:

Я, возможно, нашли ошибку сам. ToManyField должны быть направлены ингредиент и не 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. И настроить attributekwargs быть функцией обратного вызова , которая возвращает ThroughModelQuerySet.

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

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

Yeo
-2

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