如何在 postgreSQL ArrayField 中存储图像列表(django rest)

how to store a list of images in postgreSQL ArrayField (django rest)

我正在开发一个项目,使用 django-rest 作为我的后端,使用 postgreSQL 作为我的数据库。

我在 Recipe 模型中使用 postgreSQL ArrayField 来存储不同指令的多个图像。

然而,当我发送带有指令图像列表的 POST 请求时 (instructions_image_list),我收到了一个奇怪的错误。

如果有人能帮我解决这个问题,我将不胜感激。提前致谢。

错误

status_code 500
'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

模特

class Recipe(models.Model):
    id = models.UUIDField( 
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    author = models.ForeignKey(get_user_model() , on_delete=models.CASCADE, null=True, related_name='author') 
    photo_main = models.ImageField(upload_to='media/', blank=True)
    title = models.CharField(max_length=150)
    instructions_text_list = ArrayField(models.CharField(max_length=100, blank=True,null=True),default=list, blank=True ,null=True,size=15,)
    instructions_image_list = ArrayField(models.ImageField(upload_to='media/',blank=True, null=True),default=list,  blank=True ,null=True, size=15,)

观点

class RecipeCreate(CreateAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    queryset = Recipe.objects.all()
    serializer_class = RecipeCreateSerializer

    def perform_create(self, serializer):
        '''save the the current logged in user as the author of the recipe'''
        serializer.save(author=self.request.user)

最好将食谱图像单独存储 table 而不是使用 ArrayField。

class Recipe(models.Model):
......

class RecipeImage(models.Model):
   recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
   image = models.ImageField(upload_to="recipe_images/")</pre>

编辑:

您可以在 RecipeCreateSerializerRecipeCreateView 中处理多个食谱图像。

例如:


# serializer

class RecipeCreateSerializer(serializers.ModelSerializer):
      recipe_images = serializers.ListField(
        child=serializers.FileField(allow_empty_file=False, use_url=False)
    )

      class Meta:
        model = Recipe
        fields = [
           #  .. other fields
            "recipe_images",

        ]

      def create(self, validated_data):
         validated_data.pop("recipe_images", None)
         return super().create(validated_data)

# view

from django.db import transaction

class RecipeCreate(CreateAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    queryset = Recipe.objects.all()
    serializer_class = RecipeCreateSerializer
    
    @transaction.atomic
    def perform_create(self, serializer):
        '''save the the current logged in user as the author of the recipe'''
        recipe = serializer.save(author=self.request.user)
        # create recipe images here with each images uploaded
        for img in self.request.data.getlist("recipe_images"):
             RecipeImage.objects.create(image=img, recipe=recipe)
        return super().perform_create(serializer)
</pre>