【发布时间】:2018-06-02 15:51:56
【问题描述】:
我的课程是:
class B(Base_Model):
b_attribute_1 = peewee.TextField(null=True)
a = peewee.ForeignKey(A, null=True)
class A(Base_Model):
a_attribute_1 = peewee.IntegerField(null=True)
a_attribute_2 = peewee.DoubleField(null=True)
class Meta:
friend_server_address = "103.11.399.002"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.save()
from B import B
# Option (1) -- semi-works: creates incomplete object b,
# a is initialised correctly.
B.create(a=self)
# Option (2) -- does not work: b is created successfully,
# a not created, giving KeyError = "ba1".
# B.create(b_attribute_1 = kwargs["ba1"], a=self)
return
我看到代码 cmets 中描述的问题(参见选项 1 和 2)的方式是测试代码:
class test_a_and_b(unittest.TestCase):
def setUp(self):
config.database.init("test.db")
config.database.create_tables([A, B])
A(a_attribute_1 = 9705,
a_attribute_2 = 0.77,
ba1 = "this is b")
# This is the breakpoint where I study objects in memory.
pdb.set_trace()
return
def tearDownModule()
A.get().delete_instance(recursive=True, delete_nullable=True)
B.get().delete_instance(recursive=True, delete_nullable=True)
config.database.drop_tables([A, B])
os.remove("test.db")
因此,根据我在A 的__init__ 中选择的选项,我(在断点调用A.get() 和B.get() 之后)可以看到创建了完整的a 和不完整的b,或者只是完成b 和错误消息KeyError:"ba1"。 我想要的是创建两个完整的对象(数据库行)a 和 b。
我尝试查看 peewee 库,似乎他们的Model 使用了__new__,我没有看到任何__init__,所以也许这就是我的问题。在我的A 中尝试了不同的组合,但这似乎没有帮助。还尝试使用初始化,以编程方式定义属性和.save() 而不是.create() 为b,但这也没有帮助。
【问题讨论】:
标签: python constructor orm peewee