在PonyORM中,是否可以拆分实体的定义?

时间:2016-12-15 20:05:44

标签: python-3.x ponyorm

我想拆分实体类的定义,即在我最初声明类之后(但在生成映射之前)添加列。这有可能吗?

我已将问题简化为以下示例代码。它会在映射的生成上抛出pony.orm.core.ERDiagramError: Reverse attribute for Passport.person not found。当我在类定义中放置passport = Optional("Passport")时,一切正常,但我想将 passport 部分从纯部分拆分。

我明白答案可能只是:"对不起,戴夫。我担心我不能这样做。"

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


from pony.orm import *


db = Database()

### PART 1: Person ###
class Person(db.Entity):
    id = PrimaryKey(int, auto=True)


### PART 2: Passport (belonging to a Person)  ###
Person.passport = Optional("Passport")

class Passport(db.Entity):
    person = Required("Person")


db.bind("sqlite", ":memory:")
db.generate_mapping(create_tables=True)

2 个答案:

答案 0 :(得分:1)

我认为答案取决于用例。在你的评论中,你告诉你想要一个基本的"和#34;高级"您的应用程序的版本。在这种情况下,我建议使用实体继承:

########## basic.py ##########
from pony.orm import *

db = Database()

class Person(db.Entity):
    name = Required(str)
    contacts = Set("Contact")
    classtype = Discriminator(str)

class Contact(db.Entity):
    person = Required(Person)
    type = Required(str)
    value = Required(str)

########## advanced.py ##########
from basic import *

class ExtendedPerson(Person):
    passport = Optional("Passport")

class Passport(db.Entity):
    person = Required(ExtendedPerson)
    code = Required(str, unique=True)

########## main.py ##########
from advanced import *
import settings

db.bind('postgres', **settings.db_params)
db.generate_mapping(create_tables=True)

with db_session:
    john = ExtendedPerson(name='John')
    p = Passport(person=john, code='123-456')

Discriminator列是用于继承的系统列。 Pony将所有子类存储在同一个表中,并确定查看该列值的特定实例的子类。通常,Pony会自动添加此列,但如果有时您可能只导入basic模块Pony将不知道ExtendedPerson子类的存在,并且不会自动将该属性添加到实体定义。 / p>

另一个用例是当您使用由另一个开发人员编写并希望扩展其功能的第三方模块时。对于这种情况,我们计划增加在一个实体中定义关系的可能性,这将在后面定义。当我们添加这样的功能时,您将能够在Passport实体中定义关系,示例语法为:

class Person(db.Entity):         name =必需(str)

class Passport(db.Entity):
    person = Required("Person",
        reverse='passport', reverse_attr=Optional("Passport"))
    code = Required(str, unique=True)

现在Pony没有这样的功能,但我们可以在不久的将来添加它

答案 1 :(得分:0)

在浏览了PonyORM的源代码和一些反复试验后,我发现了我可以做些什么才能使它工作。虽然我不确定这是官方以及是否需要一切。所以我不确定这在将来的版本中是否仍然可以使用。

代码

.flex-container {
    display: -webkit-flex;
    display: flex;
    -webkit-flex-flow: row wrap;
    flex-flow: row wrap;
    text-align: center;
}

#navigation {
    display: block;
    width:300px;
    height: 35px;
    padding:18px 12px;
    position: fixed;
    left: 100px;
    width: 200%;
    z-index: 22222;
    transition: all ease .5s;
}

#Border {
    height: 75px;
    width: 1140px;
    position: fixed;
    background: #8e0e17;
}

li{ 
    display: inline;
    padding: 160px;
}

ul {
    list-style-type: none;
}

nav li a{
    color:grey;
    font-weight:700;
    font-size: 25px;
}