EAV-جنگو یک برنامه قابل استفاده مجدد جنگو فراهم می کند که یک پیاده سازی از مدل داده موجودیت ویژگی ارزش است.
& nbsp؛ در مدل موجودیت ویژگی ارزش (EAV)، همچنین به عنوان مدل شی-ویژگی-ارزش و طرح باز است که در شرایط استفاده شناخته شده که در آن تعدادی از ویژگی های (خواص، پارامترهای) است که می تواند مورد استفاده برای توصیف یک چیز (" نهاد "و یا" شی ") است به طور بالقوه بسیار گسترده است، اما تعداد که در واقع به یک نهاد داده شده اعمال خواهد شد نسبتا متوسط است.
EAV-جنگو خوب کار می کند با RDBMS سنتی (تست شده بر روی SQLite و خروجی).
اولویت
نرم افزار بزرگ از یک پروژه فروشگاه آنلاین، پس از آن فقط ورزش دانشگاهی است بسیار عملی و نیست. اولویت های اصلی عبارت بودند از:
و nbsp؛ 1. انعطاف پذیری از داده ها،
و nbsp؛ 2. بهره وری از نمایش داده شد، و
و nbsp؛ 3. حداکثر نگهداشت بدون ویرایش کد.
البته این به معنی این تجارت آف، و هدف این بود برای پیدا کردن حداقل ترکیبی مضر برای حالت کلی.
ویژگی ها
همه مدل ارائه انتزاعی هستند، یعنی EAV-جنگو هیچ اطلاعات در جداول خود را ذخیره نمی کند. در عوض، آن را به یک پایه و اساس مدل خود که حمایت از EAV خارج از جعبه دارند را فراهم می کند.
API EAV شامل:
و nbsp؛ * ایجاد / به روز رسانی / دسترسی: نمونه مدل ارائه API استاندارد برای هر دو زمینه "واقعی" و ویژگیها EAV. انتزاع، با این حال، در راه خود ایستاده نیست و وسیله ای برای مقابله با مسائل اساسی را فراهم می کند.
و nbsp؛ * * * * سوال: BaseEntityManager شامل روش یکنواخت در فیلتر () و حذف () به پرس و جو "واقعی" و ویژگیها EAV.
و nbsp؛ * طرحوارهها ریزی برای صفات.
و nbsp؛ * مدیریت: تمام ویژگی های پویا را می توان ارائه و در مدیریت جنگو با هیچ و یا کمی تلاش (با استفاده از eav.admin.BaseEntityAdmin) تغییر یافتهاست. طرحوارهها را می توان به طور جداگانه ویرایش، به عنوان معمولی اشیاء مدل جنگو.
و nbsp؛ * جنبه: جستجو جنبه از ویژگی های مهم فروشگاه آنلاین، کاتالوگ، و غیره است که اساسا شما یک فرم نمایندگی زیر مجموعه خاصی از مدل ویژگی ها با ویدجت ها و انتخاب مناسب به طوری که کاربر می تواند مقادیر مطلوب از برخی از خواص را انتخاب کنید نیاز دارید، ارائه فرم و دریافت لیستی از آیتم تطبیق. در حالت کلی جنگو فیلتر را انجام دهد، اما آن را نمی خواهد با EAV کار، بنابراین EAV-جنگو را فراهم می کند مجموعه ای کامل از ابزارها برای که.
نمونه
اجازه دهید یک مدل EAV-دوستانه تعریف، ایجاد یک ویژگی EAV و ببینید که چگونه آن رفتار می کند. با "ویژگی های EAV" من معنی آن در پایگاه داده به عنوان اشیاء جداگانه ذخیره می شود اما دیده و به گونه ای جستجو به عنوان اگر آنها ستون در جدول نهاد بودند:
از مدل های واردات django.db
از eav.models BaseEntity واردات، BaseSchema، BaseAttribute
میوه کلاس (BaseEntity):
& nbsp؛ از عنوان = models.CharField (MAX_LENGTH = 50)
کلاس طرحواره (BaseSchema):
& nbsp؛ از پاس
کلاس Attr (BaseAttribute):
& nbsp؛ در طرح = models.ForeignKey (طرحواره، related_name = 'attrs')
# در پوسته پایتون:
# تعریف ویژگی به نام "رنگ"
>>> COLOR = Schema.objects.create (
... عنوان = 'رنگ'،
... نام = 'رنگ'، # آنرا حذف به جمعیت / slugify از عنوان
... نوع داده = Schema.TYPE_TEXT
...)
# ایجاد یک نهاد
>>> E = Fruit.objects.create (TITLE = "اپل، رنگ = 'سبز')
# تعریف "واقعی" و EAV صفات به همان شیوه
>>> e.title
'اپل'
>>> e.colour
"سبز"
>>> e.save () # معاملات با EAV به طور خودکار ویژگی
# لیست ویژگی های EAV به عنوان نمونه Attr
>>> e.attrs.all ()
[
# جستجو بر اساس یک ویژگی EAV که اگر آن را درست عادی بود
>>> Fruit.objects.filter (رنگ = 'زرد')
[<میوه: اپل>]
# تمام جستجوها ترکیب پشتیبانی می شوند
>>> Fruit.objects.filter (colour__contains = 'داد')
[<میوه: اپل>]
توجه داشته باشید که ما می توانیم دسترسی، اصلاح و رنگ پرس و جو که اگر آن را درست نهاد درست بود، اما در همان زمان نام خود را، نوع و حتی وجود به طور کامل توسط یک نمونه طرح تعریف شده است. شی طرحواره می تواند به عنوان یک کلاس درک و اشیاء Attr مربوط موارد آن می باشد. به عبارت دیگر، اشیاء طرحواره مانند CharField، IntegerField و از جمله، تنها در سطح داده تعریف شده است، نمی سخت رمزی در پایتون می باشد. و می توان آنها را "نمونه" برای هر نهاد (مگر اینکه شما قرار داده محدودیت های سفارشی که در خارج از منطقه EAV-جنگو از مسئولیت هستند).
نام صفات در طرحوارهها مربوط به تعریف شده است. این می تواند به ترس منجر که یک بار یک نام تغییر می کند، کد است که برای شکستن. در واقع این است، در صورتی که نام ها تنها به طور مستقیم برای متغیر تجاری استفاده می شود. در تمام موارد دیگر جستجوها بدون نام سخت رمزی ساخته شده، و اشیاء EAV مرتبط به هم هستند توسط کلید اولیه، نه با نام. نام اگر اشکال وجود دارد، اما فرم ها بسته تولید شده در وضعیت فعلی ابرداده، بنابراین شما با خیال راحت می تواند تغییر نام طرحوارهها. انواع چه شما می توانید از رابط مدیر شکستن است. اگر شما تغییر نوع داده از یک طرح، تمام ویژگی های آن همان باقی خواهد ماند اما به ستون دیگر به ذخیره ارزش های خود استفاده کنید. هنگامی که شما بازگرداندن نوع داده ها، ارزش ها قبلا ذخیره شده قابل مشاهده هستند دوباره.
آزمون برای مثال بیشتر.
انواع داده ها
ساختار ابرداده محور گسترش انعطاف پذیری اما دلالت برخی از تجارت آف. یکی از آنها افزایش می یابد تعداد پیوندد (و، در نتیجه، نمایش داده شد آهسته تر). یکی دیگر از انواع داده کمتر است. از لحاظ تئوری، ما می توانیم تمام انواع داده ای در دسترس برای ذخیره سازی پشتیبانی، اما در عمل آن را به معنی ایجاد بسیاری از ستون در هر صفت تنها با چند مورد استفاده - دقیقا همان چیزی است که ما در تلاش بودند برای جلوگیری از با استفاده از EAV. به همین دلیل است EAV-جنگو تنها پشتیبانی از برخی از انواع اولیه (هر چند شما می توانید به این لیست گسترش در صورت نیاز):
و nbsp؛ * Schema.TYPE_TEXT، TextField.
و nbsp؛ * Schema.TYPE_FLOAT، FloatField.
و nbsp؛ * Schema.TYPE_DATE، DateField.
و nbsp؛ * Schema.TYPE_BOOL، NullBooleanField.
و nbsp؛ * Schema.TYPE_MANY برای انتخاب های چندگانه (به عنوان مثال لیستی از مقادیر).
همه ویژگی های EAV به عنوان سوابق در یک جدول با ترکیب منحصر به فرد از منابع به اشخاص و طرحوارهها ذخیره می شود. (نهاد از طریق چارچوب contenttypes اشاره، طرح از طریق کلید خارجی اشاره شده است.) به عبارت دیگر، وجود دارد می تواند تنها یک ویژگی با نهاد داده و طرح. طرح تعریف ویژگی است. طرح نام، عنوان، نوع داده ها و تعدادی از خواص دیگر که اعمال می شود به هر ویژگی از این طرح تعریف می کند. هنگامی که ما دسترسی داشته و یا جستجو ویژگی های EAV، ماشین آلات EAV همیشه با استفاده از طرحوارهها به عنوان ویژگی های ابرداده. چرا؟ از آنجا که نام صفت است در طرح های مربوط به ذخیره می شود، و ارزش است در یک ستون از جدول ویژگی های ذخیره شده. ما نمی دانیم که ستون آن است تا زمانی که ما در ابرداده است.
در مثال ارائه شده در بالا ما تنها با یک ویژگی متن بازی. همه انواع دیگر رفتار دقیقا همان به جز برای TYPE_MANY. یک مورد خاص چند به بسیاری از آن را به عنوان شامل مدل اضافی برای انتخاب. EAV-جنگو را فراهم می کند یک مدل انتزاعی اما نیاز شما را به تعریف یک مدل بتن (به عنوان مثال انتخاب)، و نقطه به نقطه آن را از مدل ویژگی (کلید خارجی به عنوان مثال قرار داده به نام "انتخاب"). مدل انتخاب نیز به نقطه در طرحواره داشته باشد. برای مثال بررسی آزمونهای
چه در این نسخه جدید است:
به ایجاد / به روز رسانی / دسترسی: نمونه مدل ارائه API استاندارد برای هر دو & quot؛ را واقعی & quot؛ را. رشته ها و ویژگی های EAV. انتزاع، با این حال، در راه خود ایستاده نیست و وسیله ای برای مقابله با مسائل اساسی را فراهم می کند.
پرس و جو: BaseEntityManager شامل روش یکنواخت در فیلتر () و حذف () به پرس و جو & quot؛ را واقعی و & quot؛ و EAV ویژگی های.
طرحوارهها ریزی برای صفات.
مدیر: تمام ویژگی های پویا را می توان ارائه و در مدیریت جنگو با هیچ و یا کمی تلاش (با استفاده از eav.admin.BaseEntityAdmin) تغییر یافتهاست. طرحوارهها را می توان به طور جداگانه ویرایش، به عنوان معمولی اشیاء مدل جنگو.
جنبه: جستجو جنبه است ویژگی مهم از فروشگاه آنلاین، کاتالوگ، و غیره در واقع شما یک فرم نمایندگی زیر مجموعه خاصی از مدل ویژگی ها با ویدجت ها و انتخاب مناسب نیاز به طوری که کاربر می تواند مقادیر مطلوب از برخی از خواص را انتخاب کنید، فرم و دریافت لیستی از آیتم تطبیق. در حالت کلی جنگو فیلتر را انجام دهد، اما آن را نمی خواهد با EAV کار، بنابراین EAV-جنگو را فراهم می کند مجموعه ای کامل از ابزارها برای که.
مورد نیاز:
پایتون
جنگو
نظر یافت نشد