标签: mongoengine

MongoEngine get_or_create 替代方案

我一直在 Django 应用程序中使用 MongoEngine 的 get_or_create 方法。今天,我注意到有一些重复的条目。我在 MongoEngine API Reference for get_or_create 中发现了这一点:

\n\n
\n

这需要两个单独的操作,因此存在竞争条件。由于 mongoDB 中没有事务,因此应研究其他方法,以确保使用此方法时不会意外重复数据。现在计划在 1.0 之前删除

\n
\n\n

我应该使用这样的东西吗?:

\n\n
from models import Post\npost = Post(name=\'hello\')\ntry:\n    Posts.objects.get(name=post.name)\n    print "exists"\nexcept:\n    post.save()\n    print "saved"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这能解决我的问题吗?\n有更好的方法吗?

\n

django mongodb mongoengine

2
推荐指数
1
解决办法
4387
查看次数

mongoengine中ListField的限制长度

我可以ListField无条件限制mongoengie中数据的长度if吗?

我需要这样的东西:

list = db.ListField(IntField(), max_length = 24)
Run Code Online (Sandbox Code Playgroud)

在我的document.

或者我必须在要更新时检查我的列表的长度,如果我的列表长度大于 24,则不要更新它!

python limit mongodb listfield mongoengine

2
推荐指数
1
解决办法
1558
查看次数

如何在mongoengine中通过主键获取文档?

我正在将应用程序从 App Engine 的 ndb 移植到 mongoengine。ndb提供了该Model.get_by_id方法,我想用mongoengine来实现它。那么如何通过自动生成的 id 或设置为primary_keyTrue 的任何字段来获取文档呢?

python mongodb mongoengine

2
推荐指数
1
解决办法
3934
查看次数

将列表转换为查询集

为了提高性能,在我的项目中,大多数模型实例都作为列表值存储在缓存中。但 Django Rest Framework 中的所有通用视图都期望它们是查询集对象。如何将从列表中获得的值转换为像对象这样的查询集,以便我可以使用通用视图。

说,我有一个类似的功能

def cache_user_articles(user_id):
    key = "articles_{0}".format(user_id)

    articles = cache.get(key)

    if articles is None:
        articles = list(Article.objects.filter(user_id = user_id))
        cache.set(key, articles)

    return articles
Run Code Online (Sandbox Code Playgroud)

在我看来.py,

class ArticleViewSet(viewsets.ModelViewSet):

    ...

    def get_queryset(self, request, *args, **kwargs):
        return cache_user_articles(kwargs.get(user_id))
Run Code Online (Sandbox Code Playgroud)

但是,这当然是行不通的,因为 Django Rest Framework 期望结果是get_querysetQuerySet 对象,并且根据PUT请求它会调用它的“get”方法。有什么办法可以让它与通用 DRF 视图一起使用。

python django mongoengine django-rest-framework

2
推荐指数
1
解决办法
3993
查看次数

mongoengine 批量更新插入一批记录?

我想upsert(update or insert) a list of record,其实我知道mongodbbulk从mongodb3.0开始就支持操作了。

我想知道是否mongoengine支持bulk upsert operationmongoengine (0.10.0)

如果没有,我想知道如何upsert记录列表,我知道mongoengine支持这样的insert批处理:

class User(Document):
    username = StringField(required=True)
    password = StringFiedl(required=True)
    meta = {'db_alias': 'user_info', 'collection': 'user', 
             'indexes': [{'fields': ['username'], 'unique': True}]
           }

def save_users(self, users):
    Users.objects.insert(users) # raise mongoengine.errors.NotUniqueError
Run Code Online (Sandbox Code Playgroud)

python upsert mongodb mongoengine

2
推荐指数
1
解决办法
2692
查看次数

在 MongoEngine 中增加一个 IntField

我在 Django 中有一个带有 MongoEngine 的模型,并且每次从 0 开始更新时都希望将该字段增加 1

我的模型看起来像这样,

import mongoengine

class Fix(mongoengine.Document):
    number = mongoengine.StringField(max_length=50, unique=True)
    count = mongoengine.IntField()
Run Code Online (Sandbox Code Playgroud)

我使用以下内容进行更新,但不确定如何将其设置为 0 以启动并增加 1,

Fix.objects(number="number").modify(upsert=True, new=True,set__count=???)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?

python pymongo mongoengine

2
推荐指数
1
解决办法
921
查看次数

保存参考字段 mongoengine

简单地说,我有 2 个 Document 对象:ResourceCable

class Cable(db.Document):
    _id = db.ObjectIdField()
    socket = db.EmbeddedDocumentField(Socket)

class Resource(db.Document):
    _id = db.StringField()
    cable = db.ReferenceField('Cable')
Run Code Online (Sandbox Code Playgroud)

这两个文档都已在数据库中,但资源中的电缆字段设置为null.

@resources.route('/<r_id>/add_cabling', methods=['GET'])
def set_connector(r_id):
    r = Resource.objects(id=r_id).get()
    c = Cable.objects().first()
    r.cable=c
    r.save()
    return jsonify(r)
Run Code Online (Sandbox Code Playgroud)

所以我将文档的实例传递给thenCable的实例。我得到的错误如下:Resourcesave()

ValidationError: ValidationError (Resource:res01)(ReferenceField 仅接受 DBRef 或文档:['cable'])

我不明白,因为实际上我正在传递文件本身

python mongodb mongoengine flask

2
推荐指数
1
解决办法
5082
查看次数

Mongoengine 属性错误

我正在尝试使用 Flask-Mongoengine 和 Flask-Login 为应用程序编码授权。我收到了这个奇怪的错误:

File "/usr/lib/python3.5/site-packages/mongoengine/base/document.py", line 188, in __setattr__
    super(BaseDocument, self).__setattr__(name, value)
  File "/usr/lib/python3.5/site-packages/mongoengine/base/fields.py", line 132, in __set__
    if instance._initialised:
AttributeError: _initialised
Run Code Online (Sandbox Code Playgroud)

我的models.py:

from app import app, db
from flask.ext.login import LoginManager


login_manager = LoginManager()
login_manager.init_app(app)


class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_lenght=40, required=True)
    last_name = db.StringField(max_lenght=40, required=True)
    password = db.StringField(required=True)

    def __init__(self, email, first_name, last_name, password):
        self.email = email
        self.first_name = first_name
        self.last_name = last_name
        self.password = password

    def is_authenticated(self):
        return True

    def is_active(self):
        return True …
Run Code Online (Sandbox Code Playgroud)

python mongoengine flask flask-mongoengine

2
推荐指数
1
解决办法
1526
查看次数

MongoEngine:如何将文档附加到 ListField

我在 python 中使用 mongodb。

也使用 MongoEngine 与 mongodb 进行通信。

现在我做了一些简单的具有评论功能的板系统。

[模型.py]

import datetime
from mongoengine import *
from config import DB_NAME


connect(DB_NAME)


class User(Document):
    no = SequenceField()
    userid = StringField(unique=True, required=True)
    userpw = StringField(required=True)
    created_at = DateTimeField(default=datetime.datetime.now())


class Comment(EmbeddedDocument):
    content = StringField(required=True)
    writer = ReferenceField(User, required=True)


class Board(Document):
    no = SequenceField()
    subject = StringField(required=True)
    content = StringField(required=True)
    writer = ReferenceField(User, required=True)
    comments = ListField(EmbeddedDocumentField(Comment))
    created_at = DateTimeField(default=datetime.datetime.now())
    updated_at = DateTimeField(default=datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)

在此代码中,如何将新列表附加到Boardcomments字段?

搜索了一个小时后,一些文件说,

Board.objects(no=_no).update_one(push__comments=['123', '456']) 将是完美的作品。

但它抛出 …

mongoengine

2
推荐指数
1
解决办法
4547
查看次数

MongoEngine 中的“reload()”是什么

我有这样的声明: jsonify_ok(data=mytag.reload().as_dict())

reload() 起什么作用?我们使用 reload() 的正常情况是什么?

mongodb mongoengine

2
推荐指数
1
解决办法
1265
查看次数