मुझे डर है कि संक्षिप्त जवाब यह है कि आप फ़ाइलफिल्ड या छवि फ़ील्ड कक्षाओं का उपयोग करके ऐसा नहीं कर सकते हैं; वे सिर्फ एक फ़ाइल पथ स्टोर करते हैं और फ़ाइल के वास्तविक डेटा की कोई वास्तविक अवधारणा नहीं है। हालांकि, लंबा जवाब यह है कि यदि आप अपने 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)
स्रोत
2009-04-18 22:53:35
क्या आपका मतलब है कि फ़िलफ़ील्ड का उपयोग करने वाले किसी एप्लिकेशन का परीक्षण करने के लिए मुझे एक और फ़ील्ड प्रकार बनाना चाहिए और इसे प्रतिस्थापित करना चाहिए? – Pablo
नहीं ... मैंने आपके प्रश्न को इस अर्थ के रूप में पढ़ा है कि आप डेटा को शामिल करने के लिए फिक्स्चर चाहते थे। यदि आप केवल उस फ़ाइलफिल्ड और छवि फ़ील्ड के काम का परीक्षण कर रहे हैं, तो बस परीक्षण करें कि वे सही यूआरएल और पथ उत्पन्न करते हैं ... वास्तविक छवि डेटा के बारे में चिंता न करें। –
मैं फाइलफिल्ड और छवि फ़ील्ड का परीक्षण नहीं कर रहा हूं। मैं उन साइटों का परीक्षण कर रहा हूं जो उनका उपयोग करते हैं, और साइट्स की एक चीज छवियों को फसल बनाती है और थंबनेल उत्पन्न करती है। अगर फाइलें नहीं हैं तो कोड विफल हो जाता है। और यहां तक कि अगर मैं इसके आसपास काम करता हूं, तो भी मैं पूरी तरह से अपनी साइट का परीक्षण नहीं करूँगा। – Pablo