Django-eav (मूल पैकेज अब बंद नहीं है, लेकिन कुछ संपन्न कांटे हैं )
यह समाधान इकाई गुण मान डेटा मॉडल पर आधारित है , अनिवार्य रूप से, यह वस्तुओं की गतिशील विशेषताओं को संग्रहीत करने के लिए कई तालिकाओं का उपयोग करता है। इस समाधान के बारे में महान भागों यह है कि:
- गतिशील क्षेत्रों का प्रतिनिधित्व करने के लिए कई शुद्ध और सरल Django मॉडल का उपयोग करता है, जो इसे समझना आसान है और डेटाबेस-अज्ञेयवाद;
आपको सरलता से जैसे Django मॉडल के लिए गतिशील विशेषता भंडारण को प्रभावी ढंग से संलग्न / अलग करने की अनुमति देता है:
eav.unregister(Encounter)
eav.register(Patient)
अच्छी तरह से Django व्यवस्थापक के साथ एकीकृत करता है ;
एक ही समय में वास्तव में शक्तिशाली होने के नाते।
downsides:
- बहुत कुशल नहीं है। यह स्वयं ईएवी पैटर्न की अधिक आलोचना है, जिसके लिए मॉडल में की-वैल्यू पेयर के सेट में कॉलम फॉर्मेट से डेटा को मैन्युअल रूप से मर्ज करने की आवश्यकता होती है।
- बनाए रखने के लिए कठिन। डेटा अखंडता बनाए रखने के लिए एक बहु-स्तंभ अद्वितीय कुंजी बाधा की आवश्यकता होती है, जो कुछ डेटाबेस पर अक्षम हो सकती है।
- आपको एक कांटे का चयन करने की आवश्यकता होगी , क्योंकि आधिकारिक पैकेज का रखरखाव अब नहीं है और कोई स्पष्ट नेता नहीं है।
उपयोग बहुत सीधा है:
import eav
from app.models import Patient, Encounter
eav.register(Encounter)
eav.register(Patient)
Attribute.objects.create(name='age', datatype=Attribute.TYPE_INT)
Attribute.objects.create(name='height', datatype=Attribute.TYPE_FLOAT)
Attribute.objects.create(name='weight', datatype=Attribute.TYPE_FLOAT)
Attribute.objects.create(name='city', datatype=Attribute.TYPE_TEXT)
Attribute.objects.create(name='country', datatype=Attribute.TYPE_TEXT)
self.yes = EnumValue.objects.create(value='yes')
self.no = EnumValue.objects.create(value='no')
self.unkown = EnumValue.objects.create(value='unkown')
ynu = EnumGroup.objects.create(name='Yes / No / Unknown')
ynu.enums.add(self.yes)
ynu.enums.add(self.no)
ynu.enums.add(self.unkown)
Attribute.objects.create(name='fever', datatype=Attribute.TYPE_ENUM,\
enum_group=ynu)
# When you register a model within EAV,
# you can access all of EAV attributes:
Patient.objects.create(name='Bob', eav__age=12,
eav__fever=no, eav__city='New York',
eav__country='USA')
# You can filter queries based on their EAV fields:
query1 = Patient.objects.filter(Q(eav__city__contains='Y'))
query2 = Q(eav__city__contains='Y') | Q(eav__fever=no)
PostgreSQL में Hstore, JSON या JSONB फ़ील्ड
PostgreSQL कई अधिक जटिल डेटा प्रकारों का समर्थन करता है। अधिकांश तृतीय-पक्ष पैकेज के माध्यम से समर्थित हैं, लेकिन हाल के वर्षों में Django ने उन्हें django.contrib.postgres.fields में अपनाया है।
HStoreField :
Django-hstore मूल रूप से एक तृतीय-पक्ष पैकेज था, लेकिन Django 1.8 ने HStoreField को एक अंतर्निहित में कई अन्य PostgreSQL समर्थित फ़ील्ड प्रकारों के साथ जोड़ा ।
यह दृष्टिकोण इस अर्थ में अच्छा है कि यह आपको दोनों दुनिया का सबसे अच्छा हिस्सा देता है: गतिशील क्षेत्र और संबंधपरक डेटाबेस। हालाँकि, hstore आदर्श प्रदर्शन-वार नहीं है , खासकर यदि आप एक क्षेत्र में हजारों वस्तुओं का भंडारण करने जा रहे हैं। यह केवल मूल्यों के लिए तार का समर्थन करता है।
#app/models.py
from django.contrib.postgres.fields import HStoreField
class Something(models.Model):
name = models.CharField(max_length=32)
data = models.HStoreField(db_index=True)
Django के खोल में आप इसे इस तरह से उपयोग कर सकते हैं:
>>> instance = Something.objects.create(
name='something',
data={'a': '1', 'b': '2'}
)
>>> instance.data['a']
'1'
>>> empty = Something.objects.create(name='empty')
>>> empty.data
{}
>>> empty.data['a'] = '1'
>>> empty.save()
>>> Something.objects.get(name='something').data['a']
'1'
आप hstore फ़ील्ड के विरुद्ध अनुक्रमित प्रश्न जारी कर सकते हैं:
# equivalence
Something.objects.filter(data={'a': '1', 'b': '2'})
# subset by key/value mapping
Something.objects.filter(data__a='1')
# subset by list of keys
Something.objects.filter(data__has_keys=['a', 'b'])
# subset by single key
Something.objects.filter(data__has_key='a')
JSONField :
JSON / JSONB फ़ील्ड किसी भी JSON-encodable डेटा प्रकार का समर्थन करते हैं, न केवल कुंजी / मान जोड़े, बल्कि Hstore की तुलना में अधिक कॉम्पैक्ट और (JSONB के लिए) होते हैं। कई पैकेज django-pgfields सहित JSON / JSONB फ़ील्ड को कार्यान्वित करते हैं , लेकिन Django 1.9 के रूप में, JSONField स्टोरेज के लिए JSONB का उपयोग करके एक अंतर्निहित अंतर्निहित है।
JSONField HStoreField के समान है, और बड़े शब्दकोशों के साथ बेहतर प्रदर्शन कर सकता है। यह स्ट्रिंग्स के अलावा अन्य प्रकारों का भी समर्थन करता है, जैसे कि पूर्णांक, बूलियन और नेस्टेड शब्दकोश।
#app/models.py
from django.contrib.postgres.fields import JSONField
class Something(models.Model):
name = models.CharField(max_length=32)
data = JSONField(db_index=True)
खोल में बनाना:
>>> instance = Something.objects.create(
name='something',
data={'a': 1, 'b': 2, 'nested': {'c':3}}
)
अनुक्रमित क्वेरी लगभग HStoreField के समान हैं, सिवाय घोंसले के शिकार संभव है। कॉम्प्लेक्स इंडेक्स को मैन्युअल रूप से निर्माण (या स्क्रिप्टेड माइग्रेशन) की आवश्यकता हो सकती है।
>>> Something.objects.filter(data__a=1)
>>> Something.objects.filter(data__nested__c=3)
>>> Something.objects.filter(data__has_key='a')
Django MongoDB
या अन्य NoSQL Django अनुकूलन - उनके साथ आप पूरी तरह से गतिशील मॉडल रख सकते हैं।
NoSQL Django पुस्तकालय महान हैं, लेकिन ध्यान रखें कि वे 100% Django- संगत नहीं हैं, उदाहरण के लिए, मानक Django से Django-nonrel की ओर पलायन करने के लिए आपको कई चीजों के साथ ListField के साथ कईToMany को बदलने की आवश्यकता होगी ।
इस Django MongoDB उदाहरण की जाँच करें:
from djangotoolbox.fields import DictField
class Image(models.Model):
exif = DictField()
...
>>> image = Image.objects.create(exif=get_exif_data(...))
>>> image.exif
{u'camera_model' : 'Spamcams 4242', 'exposure_time' : 0.3, ...}
तुम भी किसी भी Django मॉडल की एम्बेडेड सूची बना सकते हैं:
class Container(models.Model):
stuff = ListField(EmbeddedModelField())
class FooModel(models.Model):
foo = models.IntegerField()
class BarModel(models.Model):
bar = models.CharField()
...
>>> Container.objects.create(
stuff=[FooModel(foo=42), BarModel(bar='spam')]
)
Django- उत्परिवर्ती: Syncdb और दक्षिण-हुक के आधार पर गतिशील मॉडल
Django- उत्परिवर्ती पूरी तरह से गतिशील विदेशी कुंजी और m2m फ़ील्ड लागू करता है। और विल हार्डी और माइकल हॉल द्वारा अविश्वसनीय लेकिन कुछ हद तक समाधानों से प्रेरित है ।
ये सभी Django के दक्षिण हुक पर आधारित हैं, जो कि, DjangoCon 2011 में वॉकी हार्डी की बात के अनुसार (इसे देखें!) फिर भी उत्पादन ( प्रासंगिक स्रोत कोड ) में मजबूत और परीक्षण किए गए हैं ।
सबसे पहले इसे लागू करने के लिए माइकल हॉल था ।
हां, यह जादू है, इन तरीकों से आप किसी भी संबंधपरक डेटाबेस बैकएंड के साथ पूरी तरह से गतिशील Django ऐप, मॉडल और फ़ील्ड प्राप्त कर सकते हैं । लेकिन किस कीमत पर? क्या भारी उपयोग पर आवेदन की स्थिरता को नुकसान होगा? ये विचार किए जाने वाले प्रश्न हैं। एक साथ डेटाबेस में परिवर्तन के अनुरोध को अनुमति देने के लिए आपको एक उचित लॉक बनाए रखना सुनिश्चित करना होगा ।
यदि आप माइकल हॉल का उपयोग कर रहे हैं, तो आपका कोड इस तरह दिखाई देगा:
from dynamo import models
test_app, created = models.DynamicApp.objects.get_or_create(
name='dynamo'
)
test, created = models.DynamicModel.objects.get_or_create(
name='Test',
verbose_name='Test Model',
app=test_app
)
foo, created = models.DynamicModelField.objects.get_or_create(
name = 'foo',
verbose_name = 'Foo Field',
model = test,
field_type = 'dynamiccharfield',
null = True,
blank = True,
unique = False,
help_text = 'Test field for Foo',
)
bar, created = models.DynamicModelField.objects.get_or_create(
name = 'bar',
verbose_name = 'Bar Field',
model = test,
field_type = 'dynamicintegerfield',
null = True,
blank = True,
unique = False,
help_text = 'Test field for Bar',
)