EAV-Django

软件截图:
EAV-Django
软件详细信息:
版本: 1.4.4
上传日期: 14 Apr 15
许可: 免费
人气: 2

Rating: nan/5 (Total Votes: 0)

EAV-Django是一个可重用的Django的应用程序,提供了实体 - 属性 - 值的数据模型的实现。
 实体 - 属性 - 值模型(EAV),也被称为是用来在环境对象的属性值的模型和开放的架构,其中的属性(属性,参数),其可以用于描述一个物件的数目(“实体“或”对象“),是潜在的非常巨大的,但实际上将适用于给定的实体的数量是相对适度的。
EAV-Django的正常工作与传统的RDBMS(在SQLite和MySQL的测试)。
优先
该应用程序从网上商店的项目增长,所以这是很实际的,而不仅仅是一个学术活动。主要优先事项是:
  1。数据的灵活性,
  2。查询的效率,并
  3。最大的可维护性无需编辑代码。
当然,这意味着取舍,而目标是找到一般情况下,至少有害的组合。
产品特点
提供的所有车型都是抽象的,即EAV-Django不保存在自己的表中的任何信息。相反,它提供了自己的模型,将有EAV的支持开箱即用的基础。
该EAV API包括:
  *创建/更新/访问:模型实例提供了两种“真实”字段和属性EAV非标准API。抽象,但是,并没有站在你的方式,并提供了手段来对付潜在的东西。
  *查询:BaseEntityManager包括过滤器统一的方法()和exclude()查询“真实”和EAV属性。
  *可定制的图式的属性。
  *管理:所有的动态属性可以表示和修改Django管理没有或很少的努力(使用eav.admin.BaseEntityAdmin)。图式可以单独进行编辑,作为普通的Django模型对象。
  *方面:面搜索是在线商店,目录等一个重要的功能基本上你将需要一个形式代表与相应的部件和选择模型的某个子集的属性,使用户可以选择一些属性值可取的,提交的形式和获得的匹配的项目的列表。在一般情况下,Django的过滤器会做,但它不会与EAV工作,所以EAV,Django提供了一套完整的该工具。
范例
让我们来定义EAV友好的模式,创建一个EAV属性,看看它是如何工作。由“EAV属性”我指的是存储在数据库中作为单独的对象,但访问和搜索以这样的方式,如果他们在该实体的表列:
从django.db进口车型
从eav.models进口BaseEntity,BaseSchema,BaseAttribute
类水果(BaseEntity):
 标题= models.CharField(MAX_LENGTH = 50)
一流的架构(BaseSchema):
 通
一流的Attr(BaseAttribute):
 模式= models.ForeignKey(架构,related_name ='ATTRS“)
#在Python外壳:
#定义属性命名为“色”
>>>颜色= Schema.objects.create(
...标题='颜色',
...名称='色',#省略填充/ slugify从标题
...数据类型= Schema.TYPE_TEXT
...)
#创建一个实体
>>> E = Fruit.objects.create(标题='苹果',颜色=“绿色”)
#定义“真实”和EAV属性相同的方式
>>> e.title
'苹果'
>>> e.colour
“绿色”
>>> e.save()#处理EAV自动属性
#列表EAV的属性的Attr实例
>>> e.attrs.all()
[<的Attr:苹果:颜色“绿色”>]
由EAV属性#搜索,如果它是一个普通的场
>>> Fruit.objects.filter(颜色='黄')
[<水果:苹果>]
#所有的复合查询的支持
>>> Fruit.objects.filter(colour__contains ='吆喝')
[<水果:苹果>]
需要注意的是,我们可以访问,修改和查询的颜色,就好像它是一个真正实体的领域,但在同一时间它的名称,类型和甚至存在性完全由一个模式实例定义。 Schema对象可以理解为一类,以及相关的Attr对象的实例。换句话说,方案对象是像CharField,IntegerField和这样的,只有在数据级定义的,而不是硬编码在Python。他们可以“实例”的任何实体(除非你把自定义的制约因素是EAV,Django的责任区以外)。
属性的名称在相关的图式定义。这会导致人们担心一旦一个名称被改变时,所述代码将要打破。实际上这是并非如此,因为名称仅直接用于手工查找。在其他情况下,查询是没有硬编码名称构建和EAV对象是相通通过主键,而不是名字。该名称是否存在,如果形式,但形式的产生依赖于元数据的当前状态,这样你就可以安全地重命名的图式。你可以在管理界面突破是类型。如果您更改架构的数据类型,它的所有属性将保持不变,但将使用另一列来存储他们的价值观。当你恢复的数据类型,以前存储的值再次可见。
看到测试更多的例子。
数据类型
元数据驱动的结构,扩展的灵活性,但暗示一些取舍。其中之一是增加数目的连接(和,因此,较慢的查询)。另一种是更少的数据类型。从理论上讲,我们可以支持可用于存储所有的数据类型,但在实践中这将意味着只有几个被用于创建每个属性的列 - 正是我们试图避免使用EAV。这就是为什么EAV-的Django只支持一些基本的类型(尽管你可以根据需要扩展这个列表):
&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,Django提供了一个抽象的模型,但需要你定义一个具体的模型(如选择),并指向其从属性模型(即把命名为“选择”的外键)。在选择模式也将有指向模式。检查测试为例

什么在此版本中是新的

  • 创建/更新/访问:模型实例提供真正的&QUOT;为&QUOT非标准API;字段和EAV属性。抽象,但是,并没有站在你的方式,并提供了手段来对付潜在的东西。
  • 查询:BaseEntityManager包括过滤器统一的方法()和排除()查询&QUOT;真正的&QUOT;和EAV属性。
  • 在自定义的图式的属性。
  • 在管理:所有的动态属性可以表示和修改Django管理没有或很少的努力(使用eav.admin.BaseEntityAdmin)。图式可以单独进行编辑,作为普通的Django模型对象。
  • 在构面:面搜索是在线商店,目录等一个重要的功能基本上你将需要代表模型的某个子集与相应的部件和选择属性,以便用户可以选择一些属性值可取的一种形式,提交的形式和获得的匹配的项目的列表。在一般情况下,Django的过滤器会做,但它不会与EAV工作,所以EAV,Django提供了一套完整的该工具。

要求

  • 在Python中
  • 在Django的

显影剂的其他软件 Andrey Mikhaylenko

Timetra
Timetra

14 Apr 15

Monk
Monk

14 May 15

意见 EAV-Django

评论没有发现
添加评论
打开图片!