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

时间:2016-08-10 11:33:43

标签: django django-models django-views

我正试图改变我的模特。

目前,我使用其他模型为我的帖子保存图片。

我认为大多数人都这样使用。

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

import django.contrib.postgres.fields import ArrayField

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

class post(models.Model):
    title = ...
    content = ...
    images = ArrayField(base_field=models.ImageField(...))

我想知道的是如何在视图中创建这些base_field的数据? 如果模型是

,我们可以正常访问
class tmp(models.Model):
    img = models.ImageField()

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

img = request.FILES['data']
tmp.save()

此。

但是,在ArrayField中,我想做的是

tmp_imgs = TemporaryImagesTable.objects.filter(user=user)
for tmp_img in tmp_imgs:
    images.append(???????????????) (append or images = ?????)

我想做的是

images.append(new ImageField(tmp_img))
像这样!

请帮助我,

1 个答案:

答案 0 :(得分:2)

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

毫无疑问,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

在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

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

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