[Uliweb] Uliorm 的改进 作者 @limodou

uliorm改造基本完成,做了一些测试,目前还没发现什么问题。主要是修改了ReferenceProperty(以及它的其它,如:OneToOne, ManyToMany)中,可以使用reference_fieldname用于指定目标Model的字段。以前只能使用id字段。同时,对于ManyToMany还可以指定reversed_fieldname。如:


>>> class User(Model):
... username = Field(CHAR, max_length=20)
... year = Field(int)
>>> class Group(Model):
... name = Field(str, max_length=20)
... users = ManyToMany(User, reference_fieldname='username', reversed_fieldname='name')

reference_fieldname为目标Model User中的字段,而reversed_fieldname则为Group本身的字段。同时实现了类似django的through的参数功能,如:


>>> class User(Model):
... username = Field(CHAR, max_length=20)
... year = Field(int)
>>> class Group(Model):
... name = Field(str, max_length=20)
... users = ManyToMany(User, through='relation')
>>> class Relation(Model):
... user = Reference(User)
... group = Reference(Group)
... year = Field(int)

再复杂点:


class User(Model):
    username = Field(CHAR, max_length=20)
    year = Field(int)
class Group(Model):
    name = Field(str, max_length=20)
    users = ManyToMany(User, through='relation')
class Relation(Model):
    user = Reference(User, reference_fieldname='username')
    group = Reference(Group, reference_fieldname='name')
    year = Field(int)

这样可以通过自定义第三张表来添加额外的字段,一些使用方法如下:

#添加关系
r1 = Relation(user=a, group=g1, year=10)
r1.save()

#条件
g1.users.filter(Relation.c.year>5)

对于第三张表的定义,由于只能是先定义后使用,因此有点hack的处理,不知道会不会有问题。随着项目使用进行验证吧。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。