如何在 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>
编辑:
您可以在 RecipeCreateSerializer
和 RecipeCreateView
中处理多个食谱图像。
例如:
# 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>
我正在开发一个项目,使用 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>
编辑:
您可以在
RecipeCreateSerializer
和RecipeCreateView
中处理多个食谱图像。例如:
# 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>