我一直在 Django 应用程序中使用 MongoEngine 的 get_or_create 方法。今天,我注意到有一些重复的条目。我在 MongoEngine API Reference for get_or_create 中发现了这一点:
\n\n\n\n\n这需要两个单独的操作,因此存在竞争条件。由于 mongoDB 中没有事务,因此应研究其他方法,以确保使用此方法时不会意外重复数据。现在计划在 1.0 之前删除
\n
我应该使用这样的东西吗?:
\n\nfrom 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"\nRun Code Online (Sandbox Code Playgroud)\n\n这能解决我的问题吗?\n有更好的方法吗?
\n我可以ListField无条件限制mongoengie中数据的长度if吗?
我需要这样的东西:
list = db.ListField(IntField(), max_length = 24)
Run Code Online (Sandbox Code Playgroud)
在我的document.
或者我必须在要更新时检查我的列表的长度,如果我的列表长度大于 24,则不要更新它!
我正在将应用程序从 App Engine 的 ndb 移植到 mongoengine。ndb提供了该Model.get_by_id方法,我想用mongoengine来实现它。那么如何通过自动生成的 id 或设置为primary_keyTrue 的任何字段来获取文档呢?
为了提高性能,在我的项目中,大多数模型实例都作为列表值存储在缓存中。但 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 视图一起使用。
我想upsert(update or insert) a list of record,其实我知道mongodbbulk从mongodb3.0开始就支持操作了。
我想知道是否mongoengine支持bulk upsert operation在mongoengine (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) 我在 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)
有任何想法吗 ?
简单地说,我有 2 个 Document 对象:Resource和Cable
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'])
我不明白,因为实际上我正在传递文件本身
我正在尝试使用 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 中使用 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)
在此代码中,如何将新列表附加到Board的comments字段?
搜索了一个小时后,一些文件说,
Board.objects(no=_no).update_one(push__comments=['123', '456']) 将是完美的作品。
但它抛出 …
我有这样的声明: jsonify_ok(data=mytag.reload().as_dict())
reload() 起什么作用?我们使用 reload() 的正常情况是什么?