如何使用 postgresql/ 将图像保存到 Arrayfield?

Woo*_*Kim 1 django django-models django-views

我正在尝试更改我的模型。

现在,我使用其他模型为我的帖子保存图像。

我想大多数人都是这样使用的。

但是,如果数据库是 postgresql,我听说 django 支持 ArrayField。

import django.contrib.postgres.fields import ArrayField
Run Code Online (Sandbox Code Playgroud)

所以,我试图改变我的模型。如

class post(models.Model):
    title = ...
    content = ...
    images = ArrayField(base_field=models.ImageField(...))
Run Code Online (Sandbox Code Playgroud)

我想知道的是如何在视图中创建这些 base_field 的数据? 如果模型是我们可以正常访问

class tmp(models.Model):
    img = models.ImageField()
Run Code Online (Sandbox Code Playgroud)

在视图中,或在任何地方,我们只是喜欢

img = request.FILES['data']
tmp.save()
Run Code Online (Sandbox Code Playgroud)

这个。

然而,在ArrayField中,我想做的是

tmp_imgs = TemporaryImagesTable.objects.filter(user=user)
for tmp_img in tmp_imgs:
    images.append(???????????????) (append or images = ?????)
Run Code Online (Sandbox Code Playgroud)

我想做的是

images.append(new ImageField(tmp_img))
Run Code Online (Sandbox Code Playgroud)

像这样!

请帮我,

kt1*_*t14 6

我有一个和你一样的类似实现,最终在没有数组的情况下使用。

毫无疑问,PostgreSQL 支持的 ArrayField 在时间上是非常诱人的,这会影响您对如何使用它的判断。

ArrayField 最适合用于存储数据,例如帖子或产品的标签。如果您正在搜索特定标签或只是过滤,这可能很容易实现。

但是 ImageFields 不可搜索,或者以更好的方式未针对此类操作进行优化。我最终使用了两个表来解决这个问题:

class Post(models.Model):
    author = # Character
    place = # String
    comment = # TextField

class PostImages(models.Model):
    post  = models.ForeignKey(Post)
    image = models.ImageField()# All the meta data requried for the field
Run Code Online (Sandbox Code Playgroud)

在 views.py 中,获取特定帖子的所有图像:

# To save the post and Images
def save_images(request):
    post_data = # get all the data for post object,
                # either from form or as individual data    
    images = # Get images data from the request

    # Using atomic transactions will save from writing any data to the 
    # Database unless all the operations have been performed without any error
    with transaction.atomic():
        # Save the post data into a Post object in any manner
        post_obj = Post.objects.save(**post_data)
        # Saving all the multiple images 
        for each_image in images:
            image_obj = PostImages()
            image_obj.post = post_obj
            image_obj.image = each_image
            image_obj.save()
        # Return success or do something here  


 # To search or fetch images for post
 def get_post_images(post_pk):
      post_obj = Post.objects.get(pk=post_pk)
      post_images = PostImages(post=post_obj)
      # Do something for both of them
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣了解更多信息,可以在此处找到有关transaction.atomic() 的更多信息。

像往常一样,这是一种方法,根据您的规范,必须有其他方法来做到这一点