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

ele*_*tiv 5 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()
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

帮助!:)

ele*_*tiv 1

Peewee 的作者很友善地回答了自己。我认为使用工厂方法是最干净的解决方案,以避免与 peewee 使用 __init()__ 的方式发生冲突

您仍然可以将其放入 __init__() 中,但需要注意的是,不仅在自己实例化对象时,而且每次从数据库游标读取 Car 实例时都会调用 __init__() 。我认为您可能可以在您的 Car 对象上创建一个类方法并将其用作复杂逻辑的工厂?

参考这个