AttributeError: у объекта "Class" нет атрибута "update_one" - PullRequest
0 голосов
/ 17 февраля 2019

У меня проблема с удалением и обновлением методом update_one.Похоже, что метод не был реализован в mongoengine.Моя цель состоит в том, чтобы удалить поле Student из ListField.В примере кода моя модель показывает схему базы данных, а мое представление - маршруты моего приложения.Я хотел бы получить пример того, что мешает мне получить доступ к методу (update_one) из моего класса StudentYear.Я не знаю, как форматировать переполнение стека, так что извините заранее.

ListField (ReferenceField ('Student')).Я получаю сообщение об ошибке AttributeError: у объекта «SchoolYear» нет атрибута «update_one», и я искал решение, которое исправит самое близкое, к которому я попал, - эти две ссылки, но когда я попробовал его сам, он не работал,

MongoEngine - извлечение ссылки из ListField по 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})

1 Ответ

0 голосов
/ 04 июня 2019

Оба update/update_one доступны в

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

набора запросов, но в экземплярах документа доступно только update, поэтому вы должны просто использовать .update вместо .update_one, как в:

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