mongoengine reference field query

cankemik picture cankemik · Jan 14, 2014 · Viewed 12.7k times · Source

I'm building a reservation site for a restaurant using flask framework and mongoengine.

My main object is to fetch all the reservation objects which customer id's equal to wanted customer id with json

data = rzv.objects(restaurant=rest, customer=cdb.objects.get(id=request.args.get("customer-reservation"))).all()

When i try to trigger this query json gives me an error:

mongoengine.errors.InvalidQueryError

My Reservation model below:

class Reservations(document.Document):
    restaurant = fields.ReferenceField(Restaurant)
    customer = fields.ReferenceField(Customers)
    shift_type = fields.EmbeddedDocumentField(Shifts)
    room = fields.ReferenceField(Rooms)
    time = fields.StringField()
    covers = fields.IntField()
    status = fields.StringField(default="wait")
    desk = fields.EmbeddedDocumentField(Desks)
    date = fields.DateTimeField()
    sit_date = fields.DateTimeField()
    end_sit_date = fields.DateTimeField()
    cancel_date = fields.DateTimeField()

My Customer model below:

class Customers(document.Document):
    title = fields.StringField()
    full_name = fields.StringField()
    first_name = fields.StringField()
    last_name = fields.StringField()
    telephone = fields.StringField()
    visits = fields.StringField()

Json:

$.getJSON("?customer-reservation=" + $(this).attr("data-id"), function (data) {
            console.log(data);
            reservationFill(data);
        });

And finally the view:

    if request.args.get("customer-reservation"):
        data = rzv.objects(restaurant=rest, customer=cdb.objects.get(id=request.args.get("customer-reservation"))).all()
        return data

What is the right way to query this situation. Do i have to use a filter ?

Answer

Ross picture Ross · Jan 22, 2014

You should split the query:

customer = Customers.objects(id=request.args.get("customer-reservation")).get()
data = Reservations.objects(restaurant=rest, customer=customer).all()

Also you will need error handling for any customers that don't match.