2012-09-10 12 views
5

में फ़ाइलों का नाम बदलना मुझे पता है कि यहां एक बहुत ही समान धागा है, लेकिन मुझे मेरी समस्या का हल नहीं मिल रहा है।Django FileField

मैं एक फ़ाइल जो Django models.FileField में बचाने

मैं इस

os.rename(old_path, new_path) 
mod.direct_file = File(open(new_path)) 
mod.save() 

और यह

mod.direct_file.save(new_path, File(open(old_path))) 
os.remove(old_path) 

और कई अन्य तरीकों की कोशिश की है नाम बदलने की आवश्यकता है, लेकिन कुछ भी नहीं लग रहा था मदद। सभी तरीकों से एक नई फाइल बनाई गई है, हालांकि, फ़ाइलफील्ड में डेटा बिल्कुल नहीं बदलता है।

संपादित करें: हल

os.rename(old_path, new_path) 
cursor = connection.cursor() 
cursor.execute("UPDATE mods_mod SET direct_file = %s WHERE id = %s", [new_name, mod.id]) 
transaction.commit_unless_managed() 

उत्तर

3

वर्तमान Django प्रलेखन राज्यों:

"यदि आप एक मॉडल पर एक FileField पहुंचते हैं, तो आप पहुँचने के लिए एक प्रॉक्सी के रूप में FieldFile का एक उदाहरण दिया जाता है अंतर्निहित फाइल। " आगे पढ़ने के लिए docs देखें।

फ़ाइल खोलने के लिए पायथन फ़ाइल ऑब्जेक्ट का उपयोग करने के बजाय, आपको फ़ाइल खोलने के लिए FieldFile.open() का उपयोग करना चाहिए, फिर फ़ाइल के पथ को तदनुसार उपयोग करें। इसके बाद, मॉडल ऑब्जेक्ट को सहेजें, और पथ में परिवर्तन जारी रहना चाहिए।

+0

ओपन पद्धति पहले से ही फ़ाइल सौंपा खुलता है। फील्डफाइल के पास कोई अन्य फ़ाइल खोलने की कोई विधि नहीं है। – aemdy

+0

फ़ाइल फ़ाइलफिल्ल्ड के माध्यम से असाइन की गई है, सही? क्या आप अपने मॉडल में सभी फाइलों या मॉडल के एक उदाहरण को बदलने की कोशिश कर रहे हैं? – droxey

+0

मैं फ़ाइल 'direct_file = models.FileField (डिफ़ॉल्ट = कोई नहीं, खाली = सही, शून्य = सही, upload_to = "mod_files") का नाम बदलना चाहता हूं, इस क्षेत्र में अपलोड किया गया है। – aemdy

6

मुझे नहीं लगता कि आपको इसके लिए कच्चे एसक्यूएल का उपयोग करने की आवश्यकता है। मुझे लगता है कि आपको os सुविधा का उपयोग कर फ़ाइल का नाम बदलने की आवश्यकता है, फिर मॉडल के FileField नाम को नए नाम पर सेट करें। हो सकता है कि कुछ की तरह:

os.rename(model.direct_file.path, new_path) 
model.direct_file.name = new_name 
model.save() 
1
new_name = 'photos_preview/' + str(uuid.uuid1()) 
os.rename(photo.image_preview.path, settings.MEDIA_ROOT + new_name) 
photo.image_preview.name = new_name 
photo.save() 
1

मैं जब मैं कोई फ़ाइल एक्सटेंशन के साथ Django में बचाया धब्बे था, और मुझे लगता है कि सही करने के लिए करना चाहता था इस मुद्दे बारे में जाना। फ़िल्टर किए गए क्वेरीसेट पर लूप करते समय सबसे अच्छा उपयोग किया जाता है।

आप example.picture.path को नहीं बदल सकते हैं, और example.picture.file तक पहुंचने का प्रयास कर रहे हैं। * एक त्रुटि देगी क्योंकि इसे एक्सेस करने से पुरानी फ़ाइल खोलने का प्रयास किया जाएगा। Example.picture.name को सेट करना आपको अभी भी example.picture.file तक पहुंचने नहीं देगा। *, सहेजने के बाद भी।

आप बस स्थान पर ImageField वस्तु ही निर्धारित कर सकते हैं और सभी काम करेगा:

(Django 1.10 के साथ परीक्षण किया गया)

import imghdr 
import os 

from django.db import models 

class MyModel(models.Model): 
    picture = models.ImageField() 

instance = MyModel.objects.first() 
if os.path.exists(instance.picture.path): 
    extension = imghdr.what(instance.picture.path) 
    os.rename(instance.picture.path, instance.picture.path + '.' + extension) 
    instance.picture = instance.picture.name + '.' + extension 
    instance.save() 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^