Phil Salesses
Phil Salesses

Reputation: 870

Empty EmbeddedDocument field?

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

Answers (1)

tbicr
tbicr

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

Related Questions