5 votes

Comment initialiser un objet peewee.Model ? __init__() ne fonctionne pas

Je ne parviens pas à initialiser les champs d'un objet descendant "peewee.Model" à l'aide de l'outil habituel init (). Comment puis-je initialiser autrement ?

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()

produit cette erreur dans 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

aide ! :)

1voto

elemolotiv Points 121

L'auteur de Peewee a eu la gentillesse de répondre lui-même. Je pense que l'utilisation d'une méthode de fabrique est la solution la plus propre, pour éviter les conflits avec la façon dont Peewee utilise __init()__.

Vous pouvez toujours le mettre dans __init__() avec l'avertissement que __init__() est sera appelée non seulement lors de l'instanciation des objets, mais aussi mais aussi à chaque fois qu'une instance de Car est lue à partir d'un curseur de base de données. Je pense que que vous pourriez probablement créer une méthode de classe sur votre objet Voiture et l'utiliser. comme une usine pour une logique complexe ?

Se référer à cette .

0voto

shadow Points 75

Ce que vous faites est un peu erroné. Vous pouvez séparer la classe Car que peewee utilise pour la gestion de la base de données et utiliser une autre classe comme "class ACar() :" pour créer votre objet voiture et après cela vous pouvez sauvegarder vos données dans la base de données en appelant Car.get_or_create(magic_number=car.magic_number , color=car.color). Consultez la documentation de Peewee sur la création d'enregistrements, car la méthode que vous utilisez n'est pas la bonne. Vous sauvegardez la voiture qui est un objet de Car et non le module que Peewee est supposé vous renvoyer après avoir utilisé Car.get_or_none(...). Même si vous utilisez save, vous devez l'utiliser dans un enregistrement qui existe déjà dans la base de données. Si vous voulez créer un nouvel enregistrement, utilisez create(), et il s'agit d'une méthode de classe ( mean, Car.create()). J'espère que cela vous donne une idée de la façon de réécrire votre code. même si vous voulez une classe Car, utilisez Car.create(...) pour créer votre enregistrement et non l'objet, si vous avez déjà un enregistrement, l'objet car = Car() ce n'est pas correct, la bonne façon est car = Car.get_or_none('vos paramètres'). Car.get_or_create(...) créera un enregistrement s'il n'existe pas, voir la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X