我无法使用常规的 init ()方法初始化“ peewee.Model”后代对象的字段。我该如何初始化?
import peewee
peewee_database = peewee.SqliteDatabase('example.db')
class Config():
def __init__(self, seats, cylinders):
self.seats = seats
self.cylinders = cylinders
class Car(peewee.Model):
magic_number = peewee.IntegerField()
color = peewee.TextField()
class Meta:
database = peewee_database
def __init__(self, config):
self.magic_number = config.seats / config.cylinders
self.color = None
peewee_database.connect()
peewee_database.create_tables([Car])
config = Config(7, 6)
car = Car(config)
car.color = "blue"
car.save()
在Python3中产生此错误:
File "test.py", line 27, in <module>
car = Car(config)
File "test.py", line 20, in __init__
self.magic_number = config.seats / config.cylinders
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/peewee.py", line 3764, in __set__
instance.__data__[self.name] = value
TypeError: 'NoneType' object does not support item assignment
帮助! :)
答案 0 :(得分:0)
您仍然可以将其放在__init __()中,但要注意__init __()是 不仅会在自己实例化对象时被调用,还会被调用 每次从数据库游标读取Car实例时也是如此。我认为 您可能可以在Car对象上创建类方法并使用该方法 作为复杂逻辑的工厂?
答案 1 :(得分:0)
您在做什么是错误的。 您可以分离peewee用于数据库管理的Car类,并使用其他类(例如“ ACar()类:”)来创建您的对象car,然后您可以通过调用Car.get_or_create(magic_number = car.magic_number,将数据保存在数据库中。 color = car.color)。 请参阅有关创建记录的peewee文档。因为您使用的方式是错误的。 您正在保存的是car的对象,而不是peewee假定使用Car.get_or_none(...)后将其返回给您的模块的对象。 即使您将使用保存,您也需要在数据库中已经存在的记录中使用它。如果您想创建新记录,请使用create(),它是一个类方法(即Car.create())。 希望这能为您提供有关如何重新编写代码的想法。 即使您想要一个Car类,也可以使用Car.create(...)创建记录而不是对象,如果您已经有记录,则对象car = Car()并不正确,正确的方法是car = Car.get_or_none('您的参数')。 Car.get_or_create(...)将创建一条记录(如果不存在,请参阅文档