使用Django模型将文件保存到JSONField

2024-06-10 13:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要保存文件,但文件的数量是不确定的,在一个请求中我可以添加一个文件,然后在另一个请求帖子中,我可以再添加一个文件

出于这个原因,我认为创建一个JSONField类型字段可以帮助我解决这个问题,但我不知道这是否可能,如果可能,我不知道如何在Django中实现它

以下是我当前如何将单个文件上载到Django模型的示例:

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,因此当用户添加文件时,也会添加“路径+文件名”

有可能吗?如何制作


Tags: 文件djangoinstancefromimportfalsetrueuuid
2条回答

对于文件,我只是以图像为例

  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模型提供相同的外键即可:)

我建议您创建一个单独的模型Attachment,并通过向Attachment模型添加ForeignKey字段或按所需模型使用ManyToManyField来建立与此模型的关系

使用这种方法,您可以将许多文件添加到所需的模型中

下面是Attachment模型的一个示例:

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)

相关问题 更多 >