【问题标题】:Python mongoengine QuerySet returns unexpected valuesPython mongoengine QuerySet 返回意外的值
【发布时间】:2018-12-06 12:36:29
【问题描述】:

我已经像这样在mongoengine.Document 之上定义了dbSMS 类(我将mongoengine 导入为db):

class dbSMS(db.Document):
    sender = db.StringField(max_length=12, required=True)
    target = db.StringField(max_length=12, required=True)
    message = db.StringField(max_length=255, required=True)
    status = db.StringField(required=False)
    meta = {
        'collection': 'sms',
    }

    def __init__(self, *args, **kwargs):
        super().__init__(args, kwargs)

当我手动创建这个类的新对象时,我可以访问它的成员。但是当我尝试在数据库中查询此类的特定对象时,它会返回一些东西……嗯,很奇怪。 这是我用来查询数据库并打印结果内容的代码:

self.buffer = dbSMS.objects(sender__in = self.phones, status = 'on hold')
            for sms in self.buffer:
                print("dbSMS type: {}".format(type(sms)))
                print("dbSMS sender {}".format(sms.sender))
                print("dbSMS target {}".format(sms.target))
                print("dbSMS message {}".format(sms.message))

它应该返回几个包含成员及其值的 dbSMS 对象,但这里是输出:

dbSMS type: <class 'sms.dbSMS'>
dbSMS sender ()
dbSMS target {'sender': '+79000000000', 'message': 'Тест', '_updated': datetime.datetime(2018, 6, 26, 13, 19, 29), '__only_fields': [], '__auto_convert': False, '_created': datetime.datetime(2018, 6, 26, 13, 19, 29), '_etag': '2132f429984474ccb9755e021a1fbe4c6823ab01', 'target': '+79000000000', 'id': ObjectId('5b323d61e13823081b1db7ff'), 'status': 'on hold'}
dbSMS message None

如您所见,返回对象的类型确实是 dbSMS,但是当我尝试访问它的成员时,它给了我空元组、带有成员及其值的字典和 None。 Mongoengine 文档说明了这一点:

可以迭代 QuerySet 对象以从 数据库

因此,我希望看到我定义的类的对象。

那么,我做错了什么?也许我以错误的方式定义了dbSMS 类,或者我没有理解dbSMS.objects 究竟做了什么?

【问题讨论】:

    标签: python mongoengine


    【解决方案1】:

    是的,事实证明我以错误的方式定义了dbSMS。 QuerySet 返回了我argskwargs,而我在__init__ 中完全忽略了它们,只是盲目地将它们传递给父类。下面是它现在的工作原理:

    class dbSMS(db.DynamicDocument):
        sender = db.StringField(max_length=12, required=True)
        target = db.StringField(max_length=12, required=True)
        message = db.StringField(max_length=255, required=True)
        status = db.StringField(required=False)
        meta = {
            'collection': 'sms',
        }
    

    我完全摆脱了整个 __init__ 并将父类更改为 DynamicDocument(因为我可能需要那种可伸缩性)。现在它完全按预期工作。

    希望我愚蠢的愚蠢错误可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多