2009-04-17 7 views
10

मैं फ़ाइल नाम के साथ एक Django स्थिरता में फ़ाइलफिल्ड या छवि फ़ील्ड के क्षेत्र को आसानी से भर सकता हूं, लेकिन वह फ़ाइल मौजूद नहीं है और जब मैं अपने एप्लिकेशन का परीक्षण करने का प्रयास करता हूं तो यह विफल रहता है क्योंकि वह फ़ाइल मौजूद नहीं है।आप Django में एक फ़िक्स्चर में फ़ाइल कैसे डालते हैं?

मैं Django स्थिरता में फ़ाइलफिल्ड या छविफील्ड को सही तरीके से कैसे पॉप्युलेट कर सकता हूं ताकि फ़ाइल स्वयं भी उपलब्ध हो?

उत्तर

7

मुझे डर है कि संक्षिप्त जवाब यह है कि आप फ़ाइलफिल्ड या छवि फ़ील्ड कक्षाओं का उपयोग करके ऐसा नहीं कर सकते हैं; वे सिर्फ एक फ़ाइल पथ स्टोर करते हैं और फ़ाइल के वास्तविक डेटा की कोई वास्तविक अवधारणा नहीं है। हालांकि, लंबा जवाब यह है कि यदि आप अपने custom model fields लिखने के लिए Django API का लाभ उठाते हैं तो कुछ भी संभव है।

कम से कम, आप क्रमशः डेटा को बदलने के लिए value_to_string विधि को कार्यान्वित करना चाहते हैं (ऊपर दिए गए लिंक पर django दस्तावेज़ों में एक उदाहरण है)। ध्यान दें कि ऊपर दिए गए यूआरएल लिंक के उदाहरणों में फाइलफिल्ड और इमेजफिल्ड उप-वर्गीकरण का उल्लेख भी शामिल है, जो आपकी स्थिति के लिए उपयोगी है!

आपको यह भी तय करना होगा कि डेटा डेटाबेस में या फ़ाइल सिस्टम पर संग्रहीत किया जाना चाहिए या नहीं। यदि पूर्व में, आपको अपनी कस्टम कक्षा को ब्लॉब फ़ील्ड के रूप में कार्यान्वित करना होगा, जिसमें आप जिस डीबी का समर्थन करना चाहते हैं उसके लिए अनुकूलन शामिल है; एचटीएमएल एक .gif/.jpg/.png/.whatever url अनुरोध करते समय आपको डेटाबेस से डेटा को वापस कैसे किया जाना चाहिए इसके बारे में कुछ समर्थन प्रदान करना होगा। यदि उत्तरार्द्ध, आईएमएचओ जाने का सबसे अच्छा तरीका है, तो आपको फाइल सिस्टम में बाइनरी डेटा को क्रमबद्ध करने, क्रमबद्ध करने के लिए विधियों को लागू करना होगा। किसी भी तरह से, यदि आप इसे फ़ाइलफिल्ड और इमेजफिल्ड के सबक्लास के रूप में कार्यान्वित करते हैं, तो आपको अभी भी ऐसे एडमिन टूल और अन्य मॉड्यूल का उपयोग करने में सक्षम होना चाहिए जो ऐसी डीजेंगो सुविधाओं की अपेक्षा करते हैं।

यदि और यदि आप अधिक शामिल ब्लॉब दृष्टिकोण का उपयोग करने का विकल्प चुनते हैं, तो यहां केवल एक पुरानी प्रोजेक्ट (जब मैं Django सीख रहा था) से कोड का एक स्निपेट है जो MySQL और PostgreSQL के लिए ब्लॉब को संभालता है; आप शायद कई सुधारों को ढूंढ पाएंगे क्योंकि मैंने इसे स्पर्श नहीं किया है :-) यह क्रमबद्धता को संभाल नहीं करता है, इसलिए, आपको उपर्युक्त विधि का उपयोग करके जोड़ना होगा।

from django.db import models 
from django.conf import settings 

class BlobValueWrapper(object): 
    """Wrap the blob value so that we can override the unicode method. 
    After the query succeeds, Django attempts to record the last query 
    executed, and at that point it attempts to force the query string 
    to unicode. This does not work for binary data and generates an 
    uncaught exception. 
    """ 
    def __init__(self, val): 
     self.val = val 

    def __str__(self): 
     return 'blobdata' 

    def __unicode__(self): 
     return u'blobdata' 


class BlobField(models.Field): 
    """A field for persisting binary data in databases that we support.""" 
    __metaclass__ = models.SubfieldBase 

    def db_type(self): 
     if settings.DATABASE_ENGINE == 'mysql': 
      return 'LONGBLOB' 
     elif settings.DATABASE_ENGINE == 'postgresql_psycopg2': 
      return 'bytea' 
     else: 
      raise NotImplementedError 

    def to_python(self, value): 
     if settings.DATABASE_ENGINE == 'postgresql_psycopg2': 
      if value is None: 
       return value 
      return str(value) 
     else: 
      return value 

    def get_db_prep_save(self, value): 
     if value is None: 
      return None 
     if settings.DATABASE_ENGINE =='postgresql_psycopg2': 
      return psycopg2.Binary(value) 
     else: 
      return BlobValueWrapper(value) 
+0

क्या आपका मतलब है कि फ़िलफ़ील्ड का उपयोग करने वाले किसी एप्लिकेशन का परीक्षण करने के लिए मुझे एक और फ़ील्ड प्रकार बनाना चाहिए और इसे प्रतिस्थापित करना चाहिए? – Pablo

+0

नहीं ... मैंने आपके प्रश्न को इस अर्थ के रूप में पढ़ा है कि आप डेटा को शामिल करने के लिए फिक्स्चर चाहते थे। यदि आप केवल उस फ़ाइलफिल्ड और छवि फ़ील्ड के काम का परीक्षण कर रहे हैं, तो बस परीक्षण करें कि वे सही यूआरएल और पथ उत्पन्न करते हैं ... वास्तविक छवि डेटा के बारे में चिंता न करें। –

+0

मैं फाइलफिल्ड और छवि फ़ील्ड का परीक्षण नहीं कर रहा हूं। मैं उन साइटों का परीक्षण कर रहा हूं जो उनका उपयोग करते हैं, और साइट्स की एक चीज छवियों को फसल बनाती है और थंबनेल उत्पन्न करती है। अगर फाइलें नहीं हैं तो कोड विफल हो जाता है। और यहां तक ​​कि अगर मैं इसके आसपास काम करता हूं, तो भी मैं पूरी तरह से अपनी साइट का परीक्षण नहीं करूँगा। – Pablo

6

धारावाहिक स्थिरता में फ़ाइलों को "शामिल" करने का कोई तरीका नहीं है। यदि एक परीक्षण स्थिरता बनाते हैं, तो आपको बस इसे स्वयं करने की आवश्यकता है; सुनिश्चित करें कि फ़ाइल परीक्षण/छवि फ़ील्ड मानों द्वारा संदर्भित स्थानों में कुछ परीक्षण फ़ाइलें वास्तव में मौजूद हैं। उन फ़ील्ड के मान MEDIA_ROOT से संबंधित पथ हैं: यदि आपको आवश्यकता है, तो आप अपने परीक्षण सेटअप() विधि में कस्टम test_settings.py में MEDIA_ROOT सेट कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि आपकी टेस्ट फाइलें कहीं भी मिलती हैं।

संपादित: यदि आप अपने सेटअप में यह() विधि क्या करना चाहते हैं, तो आप भी default_storage सीधे monkeypatch कर सकते हैं:

from django.core.files.storage import default_storage 

class MyTest(TestCase): 

    def setUp(self): 
    self._old_default_storage_location = default_storage.location 
    default_storage.location = '/some/other/place' 

    def tearDown(self): 
    default_storage.location = self._old_default_storage_location 

काम करने के लिए लगता है कि। default_storage a documented public API है, इसलिए यह विश्वसनीय होना चाहिए।

+0

सेटअप में MEDIA_ROOT को सेट करना() एक बहुत अच्छा विचार की तरह लगता है। मै उसे करने की एक कोशिश तो करूंगा। धन्यवाद। – Pablo

+0

मैंने इस समाधान को एक कोशिश और बदलने की सेटिंग्स दी .MEDIA_ROOT परीक्षण विधि पर या सेटअप विधि उस स्थान को नहीं बदलेगी जहां फ़ाइल स्थित होने का प्रयास कर रही है। यह समाधान काम कर सकता है, लेकिन MEDIA_ROOT को कहीं और परिभाषित किया जाना चाहिए। – Pablo

+1

आप सही हैं, इसके बारे में खेद है। settings.MEDIA_ROOT को स्टार्टअप-टाइम पर FileSystemStorage के एक साझा साझा उदाहरण द्वारा पढ़ा जाता है जिसका उपयोग सभी फ़ाइलफिल्ड्स द्वारा किया जाता है। आपको इसे कस्टम test_settings.py में सेट करना होगा। –