使用Django框架(1.3.1)和Mongoengine。
尝试保存发布的字段(截止日期)时,它会以
ValidationError(无法解析日期“ 2013-12-31”:['DueDate'])
但是,通过datetime.datetime.now()它保存日期时效果很好。搜索示例后,我没有选择了。
我的代码的相关部分(使用带有文本输入标签的普通HTML表单):
views.py
goal.DueDate = request.POST['duedate']
goal.save()
Run Code Online (Sandbox Code Playgroud)
models.py
class Goal(Document):
DueDate = DateTimeField()
last_update = DateTimeField(required=True)
Run Code Online (Sandbox Code Playgroud)
任何的想法?
更新(目前无法回答自己):
确定..找到了解决方案。键入它,显然提供了新的见解。
Goal.DueDate = datetime.datetime.strptime(request.POST ['duedate'],'%Y-%m-%d')
我有一个问题,查询集oid在json中检索,我想检索我在下面的User集合的实际用户名:
class User(db.Document):
username = db.StringField(required=True)
password_hash = db.StringField()
is_admin = db.IntField(default=0)
class Message(db.EmbeddedDocument):
to_users = db.ListField(db.ReferenceField(User))
created_at = db.DateTimeField(default=datetime.now)
is_read = db.BooleanField(default=False)
body = db.StringField(required=True)
class Inbox(db.Document):
from_user = db.ReferenceField(User, required=True)
subject = db.StringField(max_length=255, required=True)
created_at = db.DateTimeField(default=datetime.now)
messages = db.ListField(db.EmbeddedDocumentField(Message))
username = User().get_username()
username = User.objects(username=username).first()
inbox = Inbox.objects.filter(messages__to_users__in=[username]).only('from_user', 'subject', 'created_at').to_json()
Run Code Online (Sandbox Code Playgroud)
这就是我得到的结果:
[{"created_at": {"$date": 1401593024844}, "from_user": {"$oid": "538ad45fb43fdd69076d3e64"}, "subject": "test"}]
Run Code Online (Sandbox Code Playgroud)
有这样的事情会很高兴:
[{"created_at": {"$date": 1401593024844}, "from_user": {"username": "holms"}, "subject": "test"}]
Run Code Online (Sandbox Code Playgroud)
或者某种类似的相似 "from_user" : {"User": {"username":"holms"}}
UPDATE
上面的答案适用于Document中的ReferenceField,但是EmbeddedDocument引用呢?假设我只将"消息"添加到()? …
我使用mongoengine(v0.9)作为我的由Python 3.4运行的Django(v1.8)项目的映射器.
虽然我已将以下代码添加到settings.py文件中,但是当用户尝试使用django默认管理进程连接到admin时,我仍然会收到此错误
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mongoengine.django.mongo_auth',
'myapp',
)
AUTHENTICATION_BACKENDS = ('mongoengine.django.auth.MongoEngineBackend',)
SESSION_ENGINE = 'mongoengine.django.sessions'
connect('mymongodb')
Run Code Online (Sandbox Code Playgroud)
/ admin/login /中的AttributeError
'MetaDict'对象没有属性'pk'
请求方法:POST
请求网址:http://myapp.dev: 8000/admin/login /
Django版本:1.8
异常类型:AttributeError
异常值:'MetaDict'对象没有属性'pk'
异常位置:c:\ Programs\Python34\lib\site-packages\django\contrib\auth__init __.py in login,line 111
Python可执行文件:c:\ Programs\Python34\python.exe
Python版本:3.4.2
PS:我也尝试通过编写URL模式,模板和视图来自定义登录过程,但是在调用"login()"函数时会出现相同的错误.
这是使用 mongoengine 的文档中的一些字段
_id = f.ObjectIdField(db_field="i", required=True)
name = f.StringField(db_field="n")
Run Code Online (Sandbox Code Playgroud)
我想循环遍历文档中的每个字段,看看它们是否为 XField 类型并且 is_required 为 True,有没有办法做到这一点?
我知道你可以使用列出所有字段_fields
但
for field in SomeDocument._fields:
print type(field) # always return 'str' not 'StringField' or 'ObjectField'
# Don't know how to check is_required
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
我将 django 与 mongo 一起使用,我有这种类型的模型:
class ProductDate(EmbeddedDocument):
created = DateTimeField()
updated = DateTimeField(null=True)
class Product(Document):
product_id = IntField()
saves = IntField(default=0)
title = StringField(max_length=1000)
gender = StringField(choices=settings.GENDER_CHOICES, default=settings.UNISEX, max_length=50)
date = EmbeddedDocumentField(ProductDate)
Run Code Online (Sandbox Code Playgroud)
现在,当我进行这样的查询时:
queryset = queryset.filter(title=search)
Run Code Online (Sandbox Code Playgroud)
我想首先按创建的日期时间字段中的日期排序,然后按保存排序。这样,具有相同日期而不是时间的产品将按保存次数排序。但是,我似乎找不到将硅藻土转换为日期的方法,以便它仅比较日期。
我不能这样做:
.order_by("-date__created","-saves")
Run Code Online (Sandbox Code Playgroud)
因为这是根据时间排序的。
我尝试在 mongo 中使用聚合,通过本教程:
但这对我没有帮助。
有人可以指导我如何做到这一点吗?谢谢你!
是否可以使用变量作为集合名称的一部分并根据mongoengine中的名称查询不同的集合?
例如:
我的mongoDB中有3个集合
并执行一个简单的 for 循环,例如:
collection_names = ['first', 'second', 'third']
for name in collection_names:
## Query the collection_+`name` here
Run Code Online (Sandbox Code Playgroud)
顺便问一下,我在Django中使用mongoengin,这种场景的model.py如何设置?
class Testing(DynamicDocument):
# The collection_name should be dynamic, isn't it?
meta = {'collection' : 'collection_name'}
user_name = StringField(db_field='user_name')
Run Code Online (Sandbox Code Playgroud)
非常感谢。
更新解决方案。
在 models.py 中定义不带元数据的模型:
class Testing(DynamicDocument):
## Do NOT use the meta to point to a specific collection.
user_name = StringField(db_field='user_name')
Run Code Online (Sandbox Code Playgroud)
调用该函数时,使用switch_collection切换到真正的集合:
def search_in_testing(self, name, **kwargs):
with switch_collection(Testing, 'colection_%s' % (name)):
search_results = Testing.objects(**kwargs)
return …Run Code Online (Sandbox Code Playgroud) 关于其中一个或两个案例的慢速MongoDB聚合,有很多问题:
令我困扰的是,在我正在设置的原型中,我的查询始终非常缓慢,其中:
此查询lookup对要检索的主文档执行聚合,并且这样写(使用Python的MongoEngine)
author_lookup = {
'$lookup': {
'from': 'users',
'localField': 'author_id',
'foreignField': '_id',
'as': 'author'
}
}
cursor = post_collection.Post.objects.all().aggregate(author_lookup)
Run Code Online (Sandbox Code Playgroud)
冒着重复自己的风险,就像这个原型的当前状态一样,Post要检索的文档不超过10个,可能Author需要查找3个文档.
以下是此查询连续5次点击的定时结果:
1.9418830871582031 seconds
3.0417070388793945 seconds
2.1725950241088867 seconds
1.3020501136779785 seconds
3.728671073913574 seconds
Run Code Online (Sandbox Code Playgroud)
很慢,mm?
现在,如果我删除聚合部分并只是查询:
cursor = post_collection.Post.objects.all()
Run Code Online (Sandbox Code Playgroud)
在其他条件相同的情况下,以下是此新查询连续5次点击的定时结果:
0.26596999168395996 seconds
0.00011920928955078125 seconds
0.00011205673217773438 seconds
0.0001659393310546875 seconds
0.00013589859008789062 seconds
Run Code Online (Sandbox Code Playgroud)
我要注意的第一件事是,当使用聚合时,第一个结果并不比以下结果慢.这使我认为使用当前形式的聚合查询,不执行缓存操作.
- > 使用聚合框架时有没有办法缓存结果$lookup?
第二件事是,除了在不使用聚合时工作中明显的缓存机制,似乎单独的第一个查询(未缓存)的执行速度比使用聚合时快十倍.我发现很难相信在总共10 lookup个Author文档上执行聚合超过4 个Post文档所需的速度是检索10个 …
我处理包含数字和文本的大型数据帧。显然我可以将每列/行存储为一个 sep。我的 mongoDB 中的文档,但我想在加载数据时删除和麻烦。
我考虑过使用 GridFS,它是通过使用 MongoEngine FileField 进行抽象的。与此同时,我想出了一个适合我的解决方案:
import pandas as pd
from mongoengine import Document, StringField, FileField
from io import BytesIO
class Frame(Document):
name = StringField(required=True, max_length=200, unique=True)
data = FileField()
@property
def frame(self):
str_data = BytesIO(self.data.read()).read().decode()
try:
return pd.read_json(str_data, typ="frame")
except ValueError:
return pd.read_json(str_data, typ="series")
def __str__(self):
return "{name}: \n{frame}".format(name=self.name, frame=self.frame)
def put(self, frame):
if self.data:
self.data.replace(frame.to_json().encode())
else:
self.data.new_file()
self.data.write(frame.to_json().encode())
self.data.close()
self.save()
if __name__ == '__main__':
from pydata.config import connect_production
connect_production()
frame = pd.DataFrame(data=[[1,2,4],[3,4,6]], columns=["A","B","C"], index=["X","Y"])
f …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试为 MongoEngine 中的嵌入文档编写通用删除方法。我认为可以访问包含嵌入文档的文档对象并根据父文档定义删除函数。
删除函数可能如下所示:
def delete():
{parent_document}.update(pull__myField={self})
我还不太确定这是否真的像我想象的那样有效,但我认为值得一试。我唯一不知道的是如何访问嵌入文档所在的文档。parent_document所以基本上我必须以某种方式从嵌入式文档访问上面代码中引用的文档。
有谁知道如何做到这一点?一般来说,如果有人这么认为,也许这是一个坏主意,请告诉我。
当使用 EnumField 的 ListField 时,从 MongoEngne 返回的对象中的数据不会转换回 Enum。例如:
class DaysOfTheWeek(Enum):
Mon = 1
Tue = 2
# etc ...
class C(db.Document):
days = db.ListField(db.EnumField(DaysOfTheWeek))
c1 = C(days=[DaysOfTheWeek.Mon])
assert c1.days == [DaysOfTheWeek.Mon] # OK
c1.save()
c2 = C.objects.first()
assert c2.days == [1] # OK
assert c2.days == [DaysOfTheWeek.Mon] # Fails
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?我是否错误地使用了 MongoEngine?
我正在使用 MongoEngine 0.22.1。
mongoengine ×10
mongodb ×6
python ×5
django ×4
python-3.x ×2
datetime ×1
document ×1
gridfs ×1
pandas ×1