21

在我的烧瓶应用程序中,我使用的是 MongoeEgine。我正在尝试将多个文档插入到我的 MongoDB 中的位置集合中。

我的文档类定义为

class places(db.Document):

  name = db.StringField(max_length=200, required=True)    
  loc = db.GeoPointField(required=True)

  def __unicode__(self):
    return self.name

    a=[]
    a.append({"name" : 'test' , "loc":[-87,101]})
    a.append({"name" : 'test' , "loc":[-88,101]})
    x= places(a)

最后一条语句失败

x= places(a)
TypeError: __init__() takes exactly 1 argument (2 given)

我也尝试将其保存到我的实例中

places.insert(x)
places.save(x)

都失败了。请帮忙。

4

2 回答 2

36

Places.objects.insert不需要字典列表,它必须是Places实例。正常操作是创建单个实例Places并保存或插入,例如:

Places(name="test", loc=[-87, 101]).save()
Places(name="test 2", loc=[-87, 101]).save()

但是,如果您想进行批量插入,您可以传递Places实例列表并调用insert查询集,objects例如:

Places.objects.insert([Places(name="test", loc=[-87, 101]), 
                       Places(name="test 2", loc=[-87, 101])])
于 2013-03-01T09:54:29.723 回答
10

您尝试一次为多个文档初始化Document对象。如果您查看 mongoengine 的BaseDocument类,您会发现它的__init__方法采用关键字参数字典,这些参数与单个文档的字段相关。

如果要进行批量保存,则必须创建一个地点实例列表并将其传递给insert()方法。

a = []
a.append(places(**{"name": 'test', "loc": [-87,101]}))
a.append(places(**{"name": 'test', "loc": [-88,101]}))
x = places.objects.insert(a)
于 2013-03-01T06:55:45.733 回答