如何初始化peewee.Model对象? __init __()不起作用

时间:2018-08-12 15:39:07

标签: python peewee

我无法使用常规的 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

帮助! :)

2 个答案:

答案 0 :(得分:0)

皮尤(Peewee)的作者很善于回答自己。我认为使用工厂方法是最干净的解决方案,以避免与peewee使用__init()__

的方式发生冲突。
  

您仍然可以将其放在__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(...)将创建一条记录(如果不存在,请参阅文档