【问题标题】:How to disable automatic file upload on django?如何在 django 上禁用自动文件上传?
【发布时间】:2020-11-15 13:25:45
【问题描述】:

您好,我有一个名为 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

【问题讨论】:

    标签: python django django-rest-framework model frameworks


    【解决方案1】:

    我认为你的文件是在创建时创建的,所以你只需要取消设置值,如果不是这样,请纠正我

    def create(self, validated_data):
            """
            """
            user_data = validated_data.pop('user')
            user_data.pop('foto')
            user = UserSerializer.create(UserSerializer(), validated_data=user_data)
            empleado = Empleado.objects.create(user=user,**validated_data)
            return empleado
    

    【讨论】:

      【解决方案2】:

      我的代码在哪里将文件上传到我的 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' 都可以交换到您希望存储文件的任何位置。

      Documentation

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

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

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

      【讨论】:

      • 好吧,我在另一台服务器上上传客户端文件,所以我不需要 django,如何阻止 django 保存这些文件?
      • 您将文件字段更改为 url 字段。保存/编辑模型后,您可以输入指向另一台服务器上文件的链接。
      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 2017-05-22
      • 2015-08-06
      • 2012-05-13
      • 2017-08-18
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多