这是使用 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) 我处理包含数字和文本的大型数据帧。显然我可以将每列/行存储为一个 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。
我试图将Django和Django REST框架与MongoEngine一起使用,但它似乎对我不起作用.我不知道哪里出了问题......也许有人可以帮助我.这是代码:
models.py
from mongoengine import *
class Lady(Document):
firstname = StringField()
lastname = StringField()
Run Code Online (Sandbox Code Playgroud)
serializers.py
from rest_framework import serializers
from mongoengine import *
class LadySerializer(serializers.Serializer):
firstname = serializers.CharField(max_length=50)
lastname = serializers.CharField(max_length=50)
def restore_object(self,attrs,instance=None):
if instance:
instance.firstname = attrs.get('firstname', instance.firstname)
instance.lastname = attrs.get('lastname', instance.lastname)
return instance
return Lady(**attrs)
Run Code Online (Sandbox Code Playgroud)
现在我使用交互式控制台测试序列化是否有效.我执行以下命令.
from core.models import *
from core.serializers import *
tiger = Lady(firstname='Tiger', lastname="Lily")
serial = LadySerializer(tiger)
serial.data
Run Code Online (Sandbox Code Playgroud)
我得到的是:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/evermean/Code/django/env/pourl/local/lib/python2.7/site-packages/rest_framework/serializers.py", line …Run Code Online (Sandbox Code Playgroud) 我正在为标准CRUD应用程序实现REST API.在一个示例中,要获取用户列表,客户可以调用:
GET api.site.com/users (和可选的) ?name=x phone=x email=x
传递上述可选参数可过滤我搜索的用户.
我正在尝试在Python中实现这个逻辑.我正在考虑链接子查询,如下所示:
鉴于:
users = User.objects()
然后:
if 'name' in request.args:
users = users.objects(name = request.args['name'])
Run Code Online (Sandbox Code Playgroud)
和:
# List of users is smaller after filtering by name
if 'phone' in request.args:
users = users.objects(phone = request.args['phone'])
Run Code Online (Sandbox Code Playgroud)
和:
# List of users is smaller after filtering by phone
if 'email' in request.args:
users = users.objects(email = request.args['email'])
Run Code Online (Sandbox Code Playgroud)
但是该方法不可用,我无法通过检查MongoEngine API参考或用户指南或教程来了解如何执行此操作.
如何在MongoEngine中链接子查询?
我使用pymongo版本2.6.1与mongoengine 0.8.4.我想使用给出的教程创建一个代码
链接https://mongoengine-odm.readthedocs.org/en/latest/tutorial.html
我的代码如下在sample.py文件中:
from mongoengine import *
import datetime
class BlogPost(Document):
title = StringField(required=True, max_length=200)
posted = DateTimeField(default=datetime.datetime.now)
tags = ListField(StringField(max_length=50))
class TextPost(BlogPost):
content = StringField(required=True)
class LinkPost(BlogPost):
url = StringField(required=True)
Run Code Online (Sandbox Code Playgroud)
在我运行的终端上,我得到了以下错误:
Python 2.7.3(默认,2013年4月10日,05:46:21)关于linux2的[GCC 4.6.3]输入"help","copyright","credits"或"license"以获取更多信息.
来自示例导入Post Traceback(最近一次调用最后一次):文件"",第1行,在文件"sample.py",第9行,在类TextPost(BlogPost)中:文件"/usr/local/lib/python2.7/ dist-packages/mongoengine/base/metaclasses.py",第332行,in new new_class = super_new(cls,name,bases,attrs)File"/usr/local/lib/python2.7/dist-packages/mongoengine/base /metaclasses.py",第120行,在新 基地.name) ValueError:文档BlogPost可能不是子类
请帮我.我也试过卸载并重新安装.但它不起作用.