首页 > 解决方案 > Django rest 框架 - 序列化程序无效

问题描述

再会。我正在尝试通过 POST 方法创建一个实体。我有 Serializer 和一些 javascript 代码 - 它向我发送 FormData ,我正在尝试对其进行序列化。这是我的看法:

@api_view(['POST'])
@parser_classes([MultiPartParser, FormParser])
def cocktail_create(request):
    """Создание коктейля"""
    pprint(request.data)
    serializer = CocktailCreateSerializer(data=request.data)
    pprint(serializer.fields)
    if serializer.is_valid():
       serializer.create(serializer.validated_data)
    else:
       pprint(serializer.errors)

请求数据:

{'author': '4',
'cocktail_tool': '[{"tool":"1","amount":"1"}, {"tool":"2","amount":"1"}]',
'csrfmiddlewaretoken': 'KFb9ZEBwWViF4Sm9pQxZn5KcfXpfu7t6OigeqsXZri9hoQQ1RPuS1lQDF3NJ3Aq5',
'description': 'asdasd',
'img': <InMemoryUploadedFile: pp,504x498-pad,600x600,f8f8f8.jpg (image/jpeg)>,
'name': 'Danya',
'recipe': '[{"ingredient":"1","amount":"1"},{"ingredient":"2","amount":"1"}]',
'recipe_text': '{"1":"asdasd","2":"asdasd"}',
'small_img': <InMemoryUploadedFile: pp,504x498-pad,600x600,f8f8f8.jpg (image/jpeg)>}

序列化器.字段:

{'img': ImageField(allow_null=True, max_length=100, required=False), 
'small_img': ImageField(allow_null=True, max_length=100, required=False), 
'cocktail_tool': 
CocktailToolsForCocktailCreateSerializer(many=True):
     amount = IntegerField(max_value=2147483647, min_value=-2147483648)
     tool = PrimaryKeyRelatedField(queryset=BarTool.objects.all()), 
'description': CharField(style={'base_template': 'textarea.html'}), 'name': CharField(max_length=255, 
 validators=[<UniqueValidator(queryset=Cocktail.objects.all())>]), 'recipe': 
RecipeForCocktailCreateSerializer(many=True):
   amount = IntegerField(max_value=2147483647, min_value=-2147483648)
   ingredient = PrimaryKeyRelatedField(queryset=Ingredient.objects.all()), 
'recipe_text': JSONField(decoder=None, encoder=None, style={'base_template': 'textarea.html'}), 
'author': PrimaryKeyRelatedField(allow_null=True, queryset=BarbookUser.objects.all(), 
  required=False)}

序列化程序错误:

{'cocktail_tool': [ErrorDetail(string='This field is required.', code='required')],
'recipe': [ErrorDetail(string='This field is required.', code='required')]}

我的序列化器:

class CocktailToolsForCocktailCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = CocktailTool
        fields = ("amount", "tool")


class RecipeForCocktailCreateSerializer(serializers.ModelSerializer):
    class Meta:
       model = CocktailRecipe
       fields = ("amount", "ingredient")


class CocktailCreateSerializer(serializers.ModelSerializer):
    cocktail_tool = CocktailToolsForCocktailCreateSerializer(many=True)
    recipe = RecipeForCocktailCreateSerializer(many=True)

    class Meta:
         model = Cocktail
         fields = ("img", "small_img", "cocktail_tool", "description",
                   "name", "recipe", "recipe_text", "author")

我的模型:我有一个鸡尾酒模型、成分模型和 bartool 模型,以及多对多的表格,例如:

class CocktailRecipe(models.Model):
    cocktail = models.ForeignKey(Cocktail, on_delete=models.CASCADE, related_name="recipe")
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE, related_name="ingredient")
    amount = models.IntegerField()

class CocktailTool(models.Model):
    cocktail = models.ForeignKey(Cocktail, on_delete=models.CASCADE, related_name="cocktail_tool")
    tool = models.ForeignKey("BarTool", on_delete=models.CASCADE)
    amount = models.IntegerField()

所以问题,正如你所看到的,序列化程序看到了这个字段,我没有问他。感谢您的帮助。

标签: pythondjangodjango-rest-frameworkdjango-serializer

解决方案


推荐阅读