2014-01-14 11 views
6

Ich baue eine Reservierung Website für ein Restaurant mit Flasche Rahmen und Mongoengine.Mongoengine Referenzfeld Abfrage

Meine Hauptaufgabe ist es, alle Reservierungsobjekte gleich gewünschte Kundennummer mit json

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

Wenn ich diese Abfrage json gibt mir einen Fehler auszulösen versuchen, der den Kunden-IDs zu holen:

mongoengine.errors.InvalidQueryError 

Mein Reservation Modell unten:

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() 

Meine Kunden Modell unter:

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); 
     }); 

Und schließlich die Ansicht:

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

Was ist der richtige Weg, diese Situation zu fragen. Muss ich einen Filter verwenden?

Antwort

4

sollten Sie die Abfrage aufgeteilt:

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

Auch Sie werden Fehler für alle Kunden Handhabung benötigen, die nicht übereinstimmen.

+0

dies eine Performance-Engpass wird? Das sieht so aus, als müssten wir alle Felder des Kunden abfragen (und dann zurückgeben) und dann alle Datenfelder abfragen (und zurückgeben). – benjaminz

+0

Seine mehrere Aufrufe an die Datenbank und Sie sollten immer die Menge der übertragenen Daten minimieren, indem Sie nur die Felder projizieren, die Sie benötigen. Sie können auch die zurückgegebenen Daten begrenzen, um die Kosten über das Netzwerk weiter zu senken. Es hängt von Ihrer Geschäftslogik und Ihren Anforderungen ab. Als Flaschenhals - das kommt auf den ganzen Stapel an – Ross

0

Sie in verwenden können - Wert ist in der Liste in einer einzigen Zeile (eine Liste der Werte sollte zur Verfügung gestellt werden):

data = Reservations.objects(restaurant=rest, 
       customer__in=Customers.objects.filter(id="your filter id")).all()