【问题标题】:AttributeError: "Class" object has no attribute ''update_one"AttributeError:“类”对象没有属性“update_one”
【发布时间】:2019-02-17 16:26:52
【问题描述】:

我在使用 update_one 方法删除和更新时遇到问题。似乎该方法尚未在 mongoengine 中实现。我的目标是从 ListField 中删除一个学生字段。在示例代码中,我的模型显示了数据库架构,而我的视图显示了我的应用程序的路由。我想要一个阻止我从 StudentYear 类访问方法 (update_one) 的示例。我不知道如何格式化堆栈溢出,所以提前抱歉。

ListField(ReferenceField('Student'))。我一直收到错误 AttributeError: 'SchoolYear' object has no attribute 'update_one' 我一直在寻找一个解决方案来解决我最接近的问题是这两个链接但是当我自己尝试它时它不起作用.

MongoEngine - Pull a reference from a ListField, by id

https://github.com/mongomock/mongomock/issues/458

以下链接的第 25 页显示使用 update_one 方法删除和添加 https://media.readthedocs.org/pdf/mongoengine-odm/stable/mongoengine-odm.pdf

requiredfile.txt
Click==7.0
Flask==1.0.2
Flask-MongoAlchemy==0.7.2
flask-mongoengine==0.9.5
Flask-WTF==0.14.2
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
mongoengine==0.16.3
mongomock==3.14.0
pymongo==3.7.2
sentinels==1.0.0
six==1.12.0
Werkzeug==0.14.1
WTForms==2.2.1

型号

from mongoengine import *

from mongoengine.fields import *

class Student(Document):

    FirstName  = StringField(default='')
    LastName   = StringField(default='')
    listNumber = IntField(default=0)
class SchoolYear(Document):

    year = IntField(required=True,min_value=1871, max_value=2020)
    students = ListField(ReferenceField('Student', required=True, reverse_delete_rule=CASCADE))

查看

from flask import Blueprint, jsonify, request,Response

from models import  Student, SchoolYear

from bson import json_util

@app.route('/location/', methods=['POST'])

def remove_student():

    encodedString = request.get_json()
    FirstName = str(encodedString['FirstName'])
    LastName = str(encodedString['LastName'])
    year = int(encodedString['year'])
    students_year = SchoolYear.objects(year=year).get()
    for student in students_year.students:
        if(str(student['FirstName']) == FirstName and str(student['LastName']) == LastName):

            students_year.update_one(pull__students=student)
    return jsonify({'result': 10})

【问题讨论】:

  • 似乎没有人在 python mongo 中使用 reference,但 javascript 似乎有更多关于如何执行所有这些方法的信息。
  • 所以它使用嵌入式列表而不是 ListField(ReferenceField(Class)) 但我仍然想知道它如何使用 ListField(ReferenceField(Class)) 因为我可以用数据存储在下一个桶中。

标签: python flask mongoengine


【解决方案1】:

update/update_one 都在查询集上可用

SchoolYear.objects(year=year).update_one(pull__students=student)

但在 Document 实例中只有 update 可用,因此您应该简单地使用 .update 而不是 .update_one,如下所示:

students_year = SchoolYear.objects(year=year).get()
students_year.update(pull__students=student)

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2021-04-19
    • 2022-01-19
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多