我正试图改变我的模特。
目前,我使用其他模型为我的帖子保存图片。
我认为大多数人都这样使用。
但是,如果数据库是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))
像这样!
请帮助我,
答案 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()的更多信息。
像往常一样,这是其中一种方法,必须有其他方法根据您的规范来做到这一点