微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Django的Json Field中存储文件

如何解决在Django的Json Field中存储文件

我正在研究一个项目,该项目要求用户提交各种形式的帖子。

有些帖子需要图片,而其他帖子则需要视频。为了解决这种复杂性,我在考虑使用import React,{ useState,useEffect } from 'react'; import { IonIcon,IonItem,IonAvatar,IonSpinner,IonLabel,IonList,IonToggle } from '@ionic/react'; import $ from "jquery"; //import { Icon,InlineIcon } from '@iconify/react'; import {checkmarkOutline,cloSEOutline,bluetoothOutline,chevronDownOutline} from '@iconify/icons-ion/checkmark-outline'; import {PopoverExample} from './Popover'; const BluetoothDeviceItem = (Props,{}) => { const [icon,setIcon] = useState(cloSEOutline); const [showPopover,setShowPopover] = useState(false); const [popoverEvent,setPopoverEvent] = useState(); useEffect(() => { updateIcons(); },[]); const updateIcons = () => { const item = $("#" + Props.address); const connectingIcon = $(item).find(".connecting-icons"); const spinnerIcon = $(item).find(".connecting-spinner"); switch (Props.state) { case 'not_connected': spinnerIcon.css("opacity","0"); connectingIcon.css("color","var(--ion-color-danger)"); connectingIcon.css("opacity","1"); setIcon(cloSEOutline); break; case 'connecting': spinnerIcon.css("opacity","1"); connectingIcon.css("opacity","0"); setIcon(""); break; case 'connected': spinnerIcon.css("opacity","0"); connectingIcon.css("opacity","1"); connectingIcon.css("color","var(--ion-color-success)"); setIcon(checkmarkOutline); break; } } const rerender = () => { updateIcons(); } const handleClick = async () => { const interactable = Props.interactable || true; if (Props.state !== "connecting" && Props.onClick && interactable) Props.onClick(Props.address); //If the device is already connecting,don't allow user to click again rerender(); } const toggleChanged = () => { } const interactable = Props.interactable || true; return ( <IonItem class={Props.class || "" + (Props.interactable ? " bluetooth-item-container" : "")} id={Props.address} onClick={handleClick}> <IonAvatar slot="start" class="bluetooth-icon-container"> <IonIcon icon={bluetoothOutline} class="bluetooth-icon"></IonIcon> </IonAvatar> <IonAvatar slot="end" class="connecting-icons-container"> <IonIcon icon={icon} class="connecting-icons"></IonIcon> <IonSpinner name="dots" class="connecting-spinner"></IonSpinner> {interactable ? <IonIcon icon={chevronDownOutline} class="popover-icon" onClick={(e) => { setShowPopover(true); setPopoverEvent(e); }}></IonIcon> : <></>} </IonAvatar> <IonLabel> <div className="device-name">{Props.name || "UnkNown"}</div> <div className="device-address">{Props.address}</div> </IonLabel> <PopoverExample isOpen={showPopover} cssClass='popover-style-class' event={popoverEvent} onDiddismiss={_ => { setShowPopover(false); setPopoverEvent(null); }} > <IonList> <IonItem lines="none" class="popover-item"> <IonLabel class="popover-autoconnect-label">Autoconnect</IonLabel> <IonToggle slot="end" color="success" onIonChange={toggleChanged}></IonToggle> </IonItem> </IonList> </PopoverExample> </IonItem> ); } export default BluetoothDeviceItem; s。

我当前的问题是处理文件,即图像和视频。我希望能够将文件url存储在json字段的一个字段中,但我在互联网上还没有遇到过类似的事情。

是否可以继续使用这种方法?如果是这样,怎么办?

解决方法

您可以使用Django的FileField https://docs.djangoproject.com/en/3.1/ref/models/fields/#filefield与django-rest-framework配合良好。它完全可以按您期望的方式工作(即,将URL返回到保存的文件)。

我更喜欢通过S3Boto3Storage中的django-storages将S3用作存储。您可以定义自定义存储,例如

class MyCustomStorage(S3Boto3Storage):
    location = 'private'
    default_acl = 'private'
    file_overwrite = False
    custom_domain = False

,然后在您的模型中:

class MyModel(models.Model):
    ...more fields...
    attachment = models.FileField(storage=MyCustomStorage(),null=True)
    ...more fields...
,

您可以将类似S3的服务用于该AWS S3或任何替代产品。 如果您需要本地服务,并且不想使用三方服务,则可以查看minio,该服务可以在任何服务器上本地设置。 这个想法正在遵循 您设置了minio / s3服务,并将其用作django应用程序的媒体存储(签出django-storages

因此,无论何时创建帖子,都可以将所有媒体或静态文件上传到s3,并在帖子对象中使用url。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。