代码之家  ›  专栏  ›  技术社区  ›  SerhiiL

尝试创建模型时出现属性错误

  •  1
  • SerhiiL  · 技术社区  · 10 月前

    我收到了这个错误消息

    获取字段值时发生AttributeError id 论串行器 IngredientSerializer . 序列化程序字段的名称可能不正确,并且与上的任何属性或键都不匹配 Ingredient 例子 原始异常文本为:“Ingredient”对象没有属性“Ingredient”。

    当试图在DRF中保存模型时。

    我的序列化程序:

    from django.db import transaction
    from rest_framework import serializers
    from .models import Recipe, Ingredient, RecipeIngredient, Tag
    
    
    class IngredientSerializer(serializers.ModelSerializer):
        id = serializers.PrimaryKeyRelatedField(queryset=Ingredient.objects.all, source="ingredient")
        amount = serializers.IntegerField()
    
    class Meta:
        model = RecipeIngredient
        fields = ["id", "amount"]
    
    
    class CreateRecipeSerializer(serializers.ModelSerializer):
        ingredients = IngredientSerializer(many=True)
        tags=serializers.PrimaryKeyRelatedField(...)
        image = serializers.ImageField(required=False)
        name = serializers.CharField(source="recipe_name")
    
    class Meta:
        model = Recipe
        fields = ["name", "image", "text", "cooking_time", "ingredients", "tags"]
    
    def create(self, validated_data):
        ingredients_data = validated_data.pop("ingredients")
        tags_data = validated_data.pop("tags")
    
        with transaction.atomic():
            recipe = Recipe.objects.create(**validated_data)
            recipe.tags.set(tags_data)
    
            recipe_ingredients = [
                RecipeIngredient(
                    recipe=recipe,
                    ingredient=ingredient_data["ingredient"],
                    amount=ingredient_data["amount"],
                    )
                     for ingredient_data in ingredients_data]
    
            RecipeIngredient.objects.bulk_create(recipe_ingredients)
    
        return recipe
    
    

    我的模特们在这里

    
    class Ingredient(models.Model):
      
        ingredient_name = models.CharField(max_length=MAX_LENGTH_200)
        measurement_unit = models.CharField(max_length=MAX_LENGTH_200)
    
    
    
    class Recipe(models.Model):
    
        ingredients = models.ManyToManyField(Ingredient, through="RecipeIngredient", related_name="recipes")
        tags = models.ManyToManyField(Tag, related_name="recipes")
        author = models.ForeignKey(User, on_delete=models.CASCADE,                            related_name="recipes")
        recipe_name = models.CharField(max_length=MAX_LENGTH_200)
        image = models.ImageField(upload_to="recipes/images/")
        text = models.TextField()
        cooking_time = models.PositiveIntegerField(validators=                      [MinValueValidator(1),MaxValueValidator(50000)])
    
    
    class RecipeIngredient(models.Model):
        recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE,
            related_name="recipe_ingredients")
        ingredient = models.ForeignKey(Ingredient,
            on_delete=models.CASCADE, related_name="ingredients")
        amount = models.PositiveIntegerField()
    
    
    

    我无法理解问题可能是什么,我试图在ModelSerializer的帮助下在通常的序列化器和上述序列化器上编写,但我得到了同样的错误。

    在这种情况下,如果重要的话,使用django 3.2.25。 如有任何帮助,我将不胜感激

    1 回复  |  直到 10 月前
        1
  •  1
  •   willeM_ Van Onsem    10 月前

    你使用 recipe_ingredients 作为来源 ingredients ,不 成分 ,所以:

    class CreateRecipeSerializer(serializers.ModelSerializer):
        ingredients = IngredientSerializer(many=True, source='recipe_ingredients')
        tags = serializers.PrimaryKeyRelatedField(
            queryset=Tag.objects.all(), many=True
        )
        image = serializers.ImageField(required=False)
        name = serializers.CharField(source='recipe_name')
    
        class Meta:
            model = Recipe
            fields = ['name', 'image', 'text', 'cooking_time', 'ingredients', 'tags']