Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django restfull api中使用用户名和id创建存储文件夹_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如何在django restfull api中使用用户名和id创建存储文件夹

Python 如何在django restfull api中使用用户名和id创建存储文件夹,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个用户上传的视频文件,我想使用上传文件的名称和id在media/Smat/name/id目录中创建一个单独的文件夹 model.py from django.db import models from datetime import datetime import cv2 import tempfile # from .utils import get_uploaded_video from django.utils import timezone import os def uploa

我有一个用户上传的视频文件,我想使用上传文件的名称和id在media/Smat/name/id目录中创建一个单独的文件夹

model.py

from django.db import models
from datetime import datetime
import cv2
import tempfile
# from .utils import get_uploaded_video
from django.utils import timezone
import os

def upload_to(instance, filename):
    now = timezone.now()
    base, extension = os.path.splitext(filename.lower())
    return f"Smat/{now:%Y-%m-%d}"

class MyVideo(models.Model):
    name= models.CharField(max_length=500)
    date = models.DateTimeField(auto_now_add=True)
    videofile= models.FileField(upload_to=upload_to, null=True, verbose_name="")

    def __str__(self):
        return self.name + ": " + str(self.videofile)
from rest_framework import serializers
from .models import MyVideo
from django.contrib.auth.models import User
 

class MyVideoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyVideo
        fields = fields = ['id', 'url', 'name', 'date', 'videofile']
        

class UploadVideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyVideo
        fields = ['videofile']
seriliazer.py

from django.db import models
from datetime import datetime
import cv2
import tempfile
# from .utils import get_uploaded_video
from django.utils import timezone
import os

def upload_to(instance, filename):
    now = timezone.now()
    base, extension = os.path.splitext(filename.lower())
    return f"Smat/{now:%Y-%m-%d}"

class MyVideo(models.Model):
    name= models.CharField(max_length=500)
    date = models.DateTimeField(auto_now_add=True)
    videofile= models.FileField(upload_to=upload_to, null=True, verbose_name="")

    def __str__(self):
        return self.name + ": " + str(self.videofile)
from rest_framework import serializers
from .models import MyVideo
from django.contrib.auth.models import User
 

class MyVideoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyVideo
        fields = fields = ['id', 'url', 'name', 'date', 'videofile']
        

class UploadVideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyVideo
        fields = ['videofile']

这可以通过将
upload\u to
功能更改为

导入日历
导入时间
def upload_到(实例,文件名):
ts=calendar.timegm(time.gmtime())
filepath=f“Smat/{ts}”
例如:
filepath=f“Smat/{instance.name}/{instance.id}”
base,扩展名=os.path.splitext(filename.lower())
返回文件路径

在MyVideo实例之前保存视频文件。因此,我可以通过将储蓄分为两个阶段来解决这个问题:

第一部分只是检查是否缺少pk,如果有,则将videofile实例设置为None

第二部分只是在将字段保存到模型之前检查pk

有关insite的更多信息,请参阅此链接


对于
实例.id
,我得到一个None。我想原因是因为我在模型中没有
id
作为字段如果您在模型中更改了pk字段,那么如果仍然出现错误,请使用pk字段,打印
实例
并显示输出我不明白您在my Model中更改pk字段是什么意思只需在upload_中打印
实例
,即可运行并显示结果