如何解决在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 举报,一经查实,本站将立刻删除。