У меня есть следующие классы:
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
Я вижу проблемы, описанные в комментариях к коду (см. Варианты 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")
Итакв зависимости от выбора, который я выбрал в __init__
моего A
I (после вызова A.get()
и B.get()
в точке останова), можно увидеть, что либо завершено a
, либо неполное b
создано, либо просто завершено b
и сообщение об ошибке KeyError:"ba1"
. Мне нужны два полных объекта (строки базы данных) a
и b
.
Я попытался заглянуть в библиотеку peewee, похоже, что их Model
использует __new__
, я не видел никаких __init__
, поэтому, возможно, здесь кроется моя проблема.Пробовал разные комбо в моем A
, но это вроде не помогло.Также попытался использовать инициализацию, определить атрибуты программно и .save()
вместо .create()
для b
, но это тоже не помогло.