Reputation: 870
Can someone help me please? I'm trying to simply retrieve what's in the field "addresses". I can't get it to print anything other than empty braces "[]"
Here's an example record:
{
"_id": { "$oid" : "51376F833EF9EB361F354ED0" },
"addresses": [
{
"city": "CAMBRIDGE",
"suffix": "",
"street_name": "FRANKLIN ST",
"prefix": "",
"zipcode": "49503",
"state": "MA",
"street_num": "127"
}
],
"created_at":{ "$date": 1361160419000.000000 }
}
Here's my class code:
class Buildings(db.Document):
_id = db.ObjectIdField(required=True)
addresses = db.ListField(db.EmbeddedDocumentField('Address'))
created_at = db.DateTimeField(default=datetime.datetime.now, required=False)
meta = {
'allow_inheritance': False,
'indexes': ['_id'],
'ordering': ['-created_at']
}
class Address(db.EmbeddedDocument):
city = db.StringField(required=False)
suffix = db.StringField(required=False)
street_name = db.StringField(required=False)
zipcode = db.StringField(required=False)
prefix = db.StringField(required=False)
state = db.StringField(required=False)
is_contracted = db.IntField(required=False)
street_num = db.StringField(required=False)
And a loop that should print the embedded Document but only returns a [] for each object.
for building in Buildings.objects:
print building.addresses
Any idea why this won't work?
Upvotes: 0
Views: 461
Reputation: 26050
Try check how your code store record in mongodb:
address = Address(**{
"city": "CAMBRIDGE",
"suffix": "",
"street_name": "FRANKLIN ST",
"prefix": "",
"zipcode": "49503",
"state": "MA",
"street_num": "127"
})
Buildings(_id=ObjectId(), addresses=[address]).save()
You see next result:
{
"_id": ObjectId("5146e17969d90d0f124536ee"),
"addresses": [{
"_types": ["Address" ],
"city": "CAMBRIDGE",
"suffix": "",
"street_name": "FRANKLIN ST",
"state": "MA",
"zipcode": "49503",
"prefix": "",
"_cls": "Address",
"street_num": "127"
}],
"created_at" : ISODate("2013-03-18T12:42:17.389Z")
}
I will implement your model as:
class Address(db.EmbeddedDocument):
city = db.StringField()
suffix = db.StringField()
street_name = db.StringField()
zipcode = db.StringField()
prefix = db.StringField()
state = db.StringField()
is_contracted = db.IntField()
street_num = db.StringField()
meta = {
'allow_inheritance': False,
}
class Buildings(db.Document):
addresses = db.ListField(db.EmbeddedDocumentField(Address))
created_at = db.DateTimeField(default=datetime.datetime.now)
meta = {
'allow_inheritance': False,
'indexes': ['_id'],
'ordering': ['-created_at'],
}
To store record as:
{
"_id": ObjectId("5146e2b069d90d0f2cc3911a"),
"addresses": [{
"city": "CAMBRIDGE",
"suffix": "",
"street_name": "FRANKLIN ST",
"state": "MA",
"zipcode": "49503",
"prefix": "",
"street_num": "127"
}],
"created_at": ISODate("2013-03-18T12:47:28.939Z")
}
I don't know how you save document with fields "_id": { "$oid": "51376F833EF9EB361F354ED0"}
and "created_at":{"$date": 1361160419000.000000}
, but I think that problem in it.
required
field argument by default is False
.
EmbeddedDocumentField
and ReferenceFiled
can get parameter as EmbeddedDocument
and Document
class or string ('self'
for self reference).
If you want have id as object probably you must make it also in code.
If you want have another datetime format probably you must use ComplexDateTimeField
or implement it with base class ComplexDateTimeField
.
Upvotes: 2