1

エンティティ クラスの定義を分割したい。つまり、最初にクラスを宣言した後 (ただし、マッピングを生成する前) に列を追加したい。これはまったく可能ですか?

私の問題を以下のサンプルコードに減らしました。pony.orm.core.ERDiagramError: Reverse attribute for Passport.person not foundマッピングの生成時にスローされます。クラス定義を入れるとすべてが機能しますが、パスポート部分を純粋なpassport = Optional("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)
4

2 に答える 2

1

答えはユースケースに依存すると思います。あなたのコメントでは、アプリケーションの「基本」バージョンと「高度な」バージョンが必要であると述べました。その場合、エンティティの継承を使用することをお勧めします。

########## 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 はすべてのサブクラスを同じテーブルに格納し、その列の値を見て特定のインスタンスのサブクラスを決定します。basic通常、Pony はこの列を自動的に追加しますが、モジュールだけをインポートする可能性がある場合、 Pony はExtendedPersonサブクラスの存在を認識せず、その属性をエンティティ定義に自動的に追加しません。

もう 1 つの使用例は、別の開発者によって作成されたサードパーティ モジュールを使用し、その機能を拡張したい場合です。その場合、後で定義する 1 つのエンティティだけでリレーションを定義する可能性を追加する予定です。Passportこのような機能を追加すると、エンティティだけでリレーションを定義できるようになります。構文の例は次のとおりです。

クラス Person(db.Entity): name = Required(str)

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

現在、ポニーにはそのような機能はありませんが、近い将来に追加できます

于 2016-12-16T13:08:12.393 に答える