【问题标题】:Peewee KeyError: 'i'Peewee KeyError:'我'
【发布时间】:2015-09-01 04:21:44
【问题描述】:

我从 Python 的 peewee 模块收到一个我无法解决的奇怪错误,有什么想法吗?我基本上希望拥有包含多个公司的“批次”。我正在为每个批次制作一个批次实例,并将其中的所有公司分配给该批次的行 ID。

追溯

Traceback (most recent call last):
  File "app.py", line 16, in <module>
    import models
  File "/Users/wyssuser/Desktop/dscraper/models.py", line 10, in <module>
    class Batch(Model):
  File "/Library/Python/2.7/site-packages/peewee.py", line 3647, in __new__
    cls._meta.prepared()
  File "/Library/Python/2.7/site-packages/peewee.py", line 3497, in prepared
    field = self.fields[item.lstrip('-')]
KeyError: 'i'

models.py

from datetime import datetime

from flask.ext.bcrypt import generate_password_hash
from flask.ext.login import UserMixin

from peewee import *

DATABASE = SqliteDatabase('engineering.db')

class Batch(Model):
  initial_contact_date = DateTimeField(formats="%m-%d-%Y")

  class Meta:
    database = DATABASE
    order_by = ('initial_contact_date')

  @classmethod
  def create_batch(cls, initial_contact_date):
    try:
      with DATABASE.transaction():
        cls.create(
          initial_contact_date=datetime.now
          )
        print 'Created batch!'
    except IntegrityError:
      print 'Whoops, there was an error!'


class Company(Model):
  batch_id = ForeignKeyField(rel_model=Batch, related_name='companies')
  company_name = CharField()
  website = CharField(unique=True)
  email_address = CharField()
  scraped_on = DateTimeField(formats="%m-%d-%Y")
  have_contacted = BooleanField(default=False)
  current_pipeline_phase = IntegerField(default=0)

  day_0_message_id = IntegerField()
  day_0_response = IntegerField()
  day_0_sent = DateTimeField()

  day_5_message_id = IntegerField()
  day_5_response = IntegerField()
  day_5_sent = DateTimeField()

  day_35_message_id = IntegerField()
  day_35_response = IntegerField()
  day_35_sent = DateTimeField()

  day_125_message_id = IntegerField()
  day_125_response = IntegerField()
  day_125_sent = DateTimeField()

  sector = CharField()

  class Meta:
    database = DATABASE
    order_by = ('have_contacted', 'current_pipeline_phase')

  @classmethod
  def create_company(cls, company_name, website, email_address):
    try:
      with DATABASE.transaction():
        cls.create(company_name=company_name, website=website, email_address=email_address, scraped_on=datetime.now)
        print 'Saved {}'.format(company_name)
    except IntegrityError:
      print '{} already exists in the database'.format(company_name)


def initialize():
  DATABASE.connect()
  DATABASE.create_tables([Batch, Company, User],safe=True)
  DATABASE.close()

【问题讨论】:

    标签: python flask peewee


    【解决方案1】:

    问题在于 Batch 类的元数据。请参阅 peewee 的example,其中使用了 order_by:

    class User(BaseModel):
        username = CharField(unique=True)
        password = CharField()
        email = CharField()
        join_date = DateTimeField()
    
        class Meta:
            order_by = ('username',)
    

    其中 order_by 是一个仅包含用户名的元组。在您的示例中,您省略了逗号,这使其成为常规字符串而不是元组。这将是您的那部分代码的正确版本:

    class Batch(Model):
        initial_contact_date = DateTimeField(formats="%m-%d-%Y")
    
        class Meta:
            database = DATABASE
            order_by = ('initial_contact_date',)
    

    【讨论】:

    • 完美!我总是忘记这一点:o
    • 别难过,这是一个超级常见的问题!
    猜你喜欢
    • 2018-08-13
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多