জ্যাঙ্গো-ইভ (মূল প্যাকেজটি আর মেন্টেন্ট নয় তবে এর কিছু সমৃদ্ধ কাঁটাচামচ রয়েছে )
এই সমাধানটি অ্যান্টি অ্যাট্রিবিউট মান ডেটা মডেলের উপর ভিত্তি করে , মূলত, এটি অবজেক্টগুলির গতিশীল বৈশিষ্ট্যগুলি সংরক্ষণ করতে বেশ কয়েকটি সারণী ব্যবহার করে। এই সমাধানটি সম্পর্কে দুর্দান্ত অংশগুলি হ'ল:
- গতিশীল ক্ষেত্রগুলি উপস্থাপন করতে বেশ কয়েকটি খাঁটি এবং সাধারণ জ্যাঙ্গো মডেল ব্যবহার করে, যা বোঝার জন্য সহজ করে তোলে এবং ডাটাবেস-অজোনস্টিককে;
আপনাকে জাজানো মডেলের সাথে সাধারণ কমান্ডগুলির মতো কার্যকরভাবে ডায়নামিক অ্যাট্রিবিউট স্টোরেজ সংযুক্ত / বিচ্ছিন্ন করতে দেয়:
eav.unregister(Encounter)
eav.register(Patient)
জ্যাঙ্গো অ্যাডমিনের সাথে সুন্দরভাবে সংহত হয়েছে ;
একই সঙ্গে সত্যই ক্ষমতাবান।
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 আরও বেশ কয়েকটি জটিল ডাটা টাইপ সমর্থন করে। বেশিরভাগ তৃতীয় পক্ষের প্যাকেজগুলির মাধ্যমে সমর্থিত, তবে সাম্প্রতিক বছরগুলিতে জ্যাঙ্গো সেগুলি django.contrib.postgres.fields এ গ্রহণ করেছে।
এইচস্টোরফিল্ড :
জ্যাঙ্গো-হস্টোর মূলত একটি তৃতীয় পক্ষের প্যাকেজ ছিল, তবে জ্যাঙ্গো 1.8 এইচস্টোরফিল্ডকে অন্তর্নির্মিত হিসাবে যুক্ত করেছে , আরও বেশ কয়েকটি পোস্টগ্র্রেএসকিউএল-সমর্থিত ক্ষেত্র প্রকারের সাথে।
এই পদ্ধতিকে এক অর্থে ভাল যে এটি আপনাকে উভয় পৃথিবীর মধ্যে সেরা: গতিশীল ক্ষেত্র এবং সম্পর্কযুক্ত ডাটাবেস পেতে দেয়। তবে, 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)
জ্যাঙ্গোর শেল এ আপনি এটি ব্যবহার করতে পারেন:
>>> 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')
জেএসনফিল্ড :
জেএসএন / জেএসওএনবি ক্ষেত্রগুলি যে কোনও জেএসওন-এনকোডেবল ডেটা টাইপকে সমর্থন করে, কেবল কী / মান জোড়া নয়, তবে হস্টোরের চেয়ে আরও দ্রুত এবং (জেএসওএনবির পক্ষে) আরও কমপ্যাক্ট থাকে। বেশ কয়েকটি প্যাকেজগুলি জেএসওএন / জেএসওএনবি ক্ষেত্রগুলিকে জ্যাঙ্গো -পিজিফিল্ডগুলি প্রয়োগ করে , তবে জ্যাঙ্গো ১.৯ অনুসারে, জেএসএনফিল্ড স্টোরের জন্য জেএসওএনবি ব্যবহার করে একটি বিল্ট-ইন।
জেএসএনফিল্ড এইচস্টোরফিল্ডের মতো, এবং বৃহত অভিধানের সাথে আরও ভাল সম্পাদন করতে পারে। এটি স্ট্রিং ব্যতীত অন্যান্য ধরণের, যেমন ইন্টিজার, বুলেট এবং নেস্টেড ডিকশনারিগুলিকে সমর্থন করে।
#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}}
)
সূচিকৃত প্রশ্নগুলি এইচস্টোরফিল্ডের মতো প্রায় অভিন্ন, বাদে বাসা বাঁধাই সম্ভব। কমপ্লেক্স সূচকগুলিতে ম্যানুয়ালি তৈরি (অথবা একটি স্ক্রিপ্টেড মাইগ্রেশন) প্রয়োজন হতে পারে।
>>> Something.objects.filter(data__a=1)
>>> Something.objects.filter(data__nested__c=3)
>>> Something.objects.filter(data__has_key='a')
জ্যাঙ্গো মঙ্গোডিবি
বা অন্যান্য নোএসকিউএল জ্যাঙ্গো অভিযোজন - তাদের সাথে আপনার পুরো গতিশীল মডেল থাকতে পারে।
নোএসকিউএল জ্যাঙ্গো গ্রন্থাগারগুলি দুর্দান্ত, তবে মনে রাখবেন যে এগুলি 100% জ্যাঙ্গো-সামঞ্জস্যপূর্ণ নয়, উদাহরণস্বরূপ, স্ট্যান্ডার্ড জাজানো থেকে জ্যাঙ্গো-ননরেলে স্থানান্তরিত করার জন্য আপনাকে মন্টিটোম্যানিকে অন্য জিনিসগুলির মধ্যে তালিকাফিল্ডের সাথে প্রতিস্থাপন করতে হবে ।
এই জ্যাঙ্গো মঙ্গোডিবি উদাহরণটি দেখুন:
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, ...}
আপনি যে কোনও জ্যাঙ্গো মডেলের এম্বেড তালিকা তৈরি করতে পারেন :
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')]
)
জ্যাঙ্গো-মিউট্যান্ট: সিঙ্কডিবি এবং সাউথ-হুকের উপর ভিত্তি করে গতিশীল মডেল
জ্যাঙ্গো-মিউট্যান্ট সম্পূর্ণ গতিশীল বিদেশী কী এবং এম 2 এম ক্ষেত্র প্রয়োগ করে। এবং উইল হার্ডি এবং মাইকেল হলের অবিশ্বাস্য তবে কিছুটা হ্যাকিশ সমাধান দ্বারা অনুপ্রাণিত ।
এগুলি সমস্ত জ্যাঙ্গো সাউথ হুকের উপর ভিত্তি করে তৈরি করা হয়েছে, যা জঙ্গোকন ২০১১-তে উইল হার্ডির বক্তব্য অনুসারে (এটি দেখুন!) তবুও দৃ in় এবং উত্পাদনে পরীক্ষামূলক ( প্রাসঙ্গিক উত্স কোড )।
প্রথম এই বাস্তবায়ন ছিল মাইকেল হল ।
হ্যাঁ, এটি ম্যাজিক, এই পদ্ধতির সাহায্যে আপনি কোনও প্রাসঙ্গিক ডাটাবেস ব্যাকএন্ডের সাথে সম্পূর্ণ গতিশীল জ্যাঙ্গো অ্যাপস, মডেল এবং ক্ষেত্রগুলি অর্জন করতে পারেন । তবে কী দামে? ভারী ব্যবহারের ফলে প্রয়োগের স্থায়িত্ব কি ক্ষতিগ্রস্থ হবে? এই বিবেচনা করা প্রশ্ন। একসাথে ডাটাবেস পরিবর্তনের অনুরোধগুলি মঞ্জুর করার জন্য আপনার যথাযথ লক বজায় রাখা নিশ্চিত হওয়া উচিত ।
আপনি যদি মাইকেল হলস লিব ব্যবহার করেন তবে আপনার কোডটি এর মতো দেখাবে:
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',
)