Django REST Framework: прямое назначение передней стороне множества «многие ко многим» запрещено - PullRequest
0 голосов
/ 06 июня 2018

У меня есть класс Рецепта и Ингредиента, где у меня есть м2м на модели ингредиента.Я проверил модель в админ-панели и работал нормально.Однако, когда я попытался создать их в оболочке, я получил ошибку (см. Ошибку ниже).

class Ingredient(models.Model):
    name = models.CharField(max_length=50)
    amount = models.IntegerField(default=1)
    ingredients = models.ManyToManyField(Recipe, related_name='ingredients')


class IngredientSerializer(ModelSerializer):
    class Meta:
        fields = ['name', 'amount']
        model = Ingredient



class Recipe(models.Model):
    owner = models.ForeignKey('auth.User', related_name='recipes', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=200, blank=True)
    image = models.CharField(max_length=100, blank=True)


class RecipeSerializer(ModelSerializer):
        ingredients = IngredientSerializer(many=True)
        owner = ReadOnlyField(source='owner.username')

    class Meta:
        fields = ['owner', 'name', 'description', 'image', 'ingredients']
        model = Recipe

Команда оболочки

beefsoup = Recipe.objects.create(owner=user, name="beef", description="goot", image="httplo")
tomatoes = Ingredient.objects.create(ingredients=beefsoup ,name='tomatoes', amount=2)

Ошибка
TypeError: прямое назначение передней стороне множества «многие ко многим» запрещено.Вместо этого используйте ингредиенты.set ().

1 Ответ

0 голосов
/ 06 июня 2018

Как показывают сообщение об ошибке и Django Docs , ваш фрагмент должен выглядеть следующим образом:

  beefsoup = Recipe.objects.create(owner=user, name="beef", description="goot", image="httplo")
  beefsoup.ingredients.create(name='tomatoes', amount=2)

Кроме того, судя по именам моделей и свойств, кажется, что дизайн ваших отношенийэто неверно.Это должно выглядеть так:

class Ingredient(models.Model):
    name = models.CharField(max_length=50)
    amount = models.IntegerField(default=1)


class IngredientSerializer(ModelSerializer):
    class Meta:
        fields = ['name', 'amount']
        model = Ingredient


class Recipe(models.Model):
    owner = models.ForeignKey('auth.User', related_name='recipes', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=200, blank=True)
    image = models.CharField(max_length=100, blank=True)
    ingredients = models.ManyToManyField(Ingredients, related_name='recipes')


class RecipeSerializer(ModelSerializer):
    ingredients = IngredientSerializer(many=True)
    owner = ReadOnlyField(source='owner.username')

    class Meta:
        fields = ['owner', 'name', 'description', 'image', 'ingredients']
        model = Recipe

Обратите внимание, что ingredients теперь находится в Recipe модели.

...