[英]Save file with Django Model to JSONField
我需要保存文件,但是文件数量不确定,在一个请求中我可以添加一个文件,然后在另一个请求帖子中,我可以再添加一个文件...
出于这个原因,我认为创建一个 JSONField 类型的字段可以帮助我解决这个问题,但我不知道这是否可能,如果可能的话,我不知道如何在 Django 中实现它。
这是我当前如何将单个文件上传到 Django Model 的示例:
import uuid
import time
from users.models import User
from django.db import models
def upload_location(instance, filename):
filebase, extension = filename.split('.')
milliseconds = int(round(time.time() * 1000))
return 'events/thumbnail_images/%s__%s__%s.%s' % (instance.user_id, instance.name, milliseconds, extension)
class Test(models.Model):
id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False, null=False)
image_link = models.FileField(upload_to=upload_location)
user = models.ForeignKey(
User,
null=True,
blank=False,
on_delete=models.CASCADE
)
由于我使用的是 Postgres 关系数据库,并且我不确定用户要保存多少文件,所以我想使用 JSONField,这样当用户添加文件时,也会添加“路径+文件名”。
这是可能的? 怎么做?
I suggest you to create a separate model Attachment
and make the relation with this model by adding ForeignKey
field To Attachment
model or using ManyToManyField
by desired model.
使用这种方法,您可以将许多文件添加到所需的 model。
以下是Attachment
model 的示例:
import uuid
import time
from users.models import User
from django.db import models
def upload_location(instance, filename):
filebase, extension = filename.split('.')
milliseconds = int(round(time.time() * 1000))
return 'events/thumbnail_images/%s__%s__%s.%s' % (instance.user_id, instance.name, milliseconds, extension)
class Test(models.Model):
id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False, null=False)
user = models.ForeignKey(User,null=True,blank=False,on_delete=models.CASCADE)
class Attachment(models.Model):
# here is the relation
test = models.ForeignKey(Test, on_delete=models.CASCADE)
name = models.CharField(verbose_name="Attachment Name", max_length=255, null=True, blank=True)
att_img = models.ImageField(
upload_to=upload_location,
verbose_name="Attach an Image",
null=True, blank=True, max_length=255
)
att_file = models.FileField(
upload_to=upload_location,
verbose_name="Attach a File",
null=True, blank=True, max_length=255
)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '%s - %s' % (self.name, self.test)
对于文件,我只是以图像为例
class ImageClass(models.Model):
YourClassHere_FK_image = models.ForeignKey(
'YourClassHere', related_name='images', on_delete=models.CASCADE)
title = models.CharField(max_length=200, blank=True)
image = models.ImageField(upload_to=UploadedConfigPath_image, verbose_name='Image', null=True, blank=True, validators=[FileExtensionValidator(allowed_extensions=[
'jpg', 'png', 'jpeg', 'webp'])], help_text="Something related images")
然后在你的 forms.py 文件中做这样的事情
class Mult_ImageForm(forms.Form):
multiple_images = forms.FileField(required=False, help_text='Select Multiple Images(jpg,png) for your Class if you want (Optional) Max:10',
widget=forms.ClearableFileInput(attrs={'multiple': True, 'accept': 'image/*'}))
然后做views.py
def post_create(request):
mul_images_product = Mult_ImageForm(request.POST,request.FILES)
if request.method == 'POST':
Your code here
同样在您的 HTML 中,您需要呈现此表单,因为您说可以一次又一次地请求它。 根据我的理解,这是最简单的方法。 您可以添加任意数量的文件,只需在您的视图中为您的 ImageClass model 提供相同的外键即可:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.