首页 > 解决方案 > 如何在 django 上禁用自动文件上传?

问题描述

嗨,我有一个名为 foto 的列,我使用这个列来存储我的 firebase 存储的路径,所以我不需要 django 存储,但是每次我上传我的文件时,django 都会生成一个新文件。

from django.db import models
from users.models import User

class Empleado(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    fecha_contratacion = models.DateField(null=True,blank=True)
    fecha_nacimiento = models.DateField(null=True,blank=True)
    curp = models.CharField(unique=True, max_length=200)
    rfc = models.CharField(unique=True, max_length=200)
    telefono = models.CharField(max_length=200)
    foto = models.ImageField(blank=True, null=True, upload_to='fotos/')

我也有一个 django rest 框架序列化程序,我的代码在哪里将文件上传到我的 django 项目?

from rest_framework import serializers
from .models import Empleado
from django.core import serializers as django_serializers
from users.serializers import UserSerializer, User
from .firebase import Firebase
    
    class EmpleadoSerializer(serializers.ModelSerializer):
        """
        Currently unused in preference of the below.
        """
        fecha_contratacion = serializers.DateField()
        fecha_nacimiento = serializers.DateField()
        curp = serializers.CharField(required=True)
        rfc = serializers.CharField(required=True)
        telefono = serializers.CharField(required=True)
        user = UserSerializer(required=False)
        foto = serializers.ImageField(required=False)
    
        class Meta:
            model = Empleado
            fields = ('foto','user_id','user','fecha_contratacion','fecha_nacimiento','curp','rfc','telefono')
    
        def create(self, validated_data):
            """
            """
            user_data = validated_data.pop('user')
            user = UserSerializer.create(UserSerializer(), validated_data=user_data)
            empleado = Empleado.objects.create(user=user,**validated_data)
            return empleado
    
        def update(self, instance, validated_data):
            if 'user' in validated_data:
                user_data = validated_data.pop('user')
                user = User.objects.get(id=instance.user_id)
                user = UserSerializer.update(UserSerializer(), user, validated_data=user_data)
            
            instance.fecha_contratacion = validated_data.get('fecha_contratacion', instance.fecha_contratacion)
            instance.fecha_nacimiento = validated_data.get('fecha_nacimiento', instance.fecha_nacimiento)
            instance.curp = validated_data.get('curp', instance.curp)
            instance.rfc = validated_data.get('rfc', instance.rfc)
            instance.telefono = validated_data.get('telefono', instance.telefono)
    
            if 'foto' in validated_data:
                instance.foto = validated_data.get('foto', instance.foto)
                instance.save()
                firebase = Firebase()
                firebase.upload(instance.foto)
            else: 
                instance.save()
            
            return instance

标签: pythondjangodjango-rest-frameworkmodelframeworks

解决方案


我的代码在哪里将文件上传到我的 Django 项目?

这不应该与您的 settings.py 一起提供,但添加这些是安全的:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'media'),
]

FILE_UPLOAD_TEMP_DIR = os.path.join(BASE_DIR, 'tmp')
  • 媒体根设置只是保存用户上传文件的目录的文件路径。
  • Staticfiles_dirs 是将上传的文件存储在本地计算机中的位置。
  • Temp_dir 是一个保存部分上传的目录(文件的某些部分可能在其他部分之前通过)。

事实上,在我上面提供的代码中,“media”和“tmp”都可以交换到您希望存储文件的任何位置。

文档

从我的firebase存储中存储路径但是每次我上传我的文件django都会生成一个新文件

Django 从不生成新文件。文件系统中显示的文件是您上传的文件。如果您是客户,您将不会看到这一点,因为您上传的所有文件都以一种或另一种方式发送到您的主机。

您不能只存储路径,因为如果文件被移动或删除应该怎么办?


推荐阅读