2017-02-20 5 views
1

Wenn die folgende QuerySet in der Shell Django Ausführung (python manage.py shell):QuerySet in der Schale arbeiten, aber nicht in Views.py - Django 1.10

Employee.objects.filter(restaurant__pk = 1) 

ich ein Ergebnis zurück:

<QuerySet [<Employee: Joyce McDonnals>]> 

Bitte Entschuldigung, weil ich neu in Django bin. Ich versuche, dieses Abfrage-Set dynamisch in meiner Webseite durch das PK zu implementieren. Die get_queryset, die ich im views.py definiert ist:

class EmployeeList(ListView): 
    template_name= "Restaurants/employee_list.html" 
    model = Employee 
def get_queryset(self, **kwargs): 
     queryset = Employee.objects.filter(pk= restaurant.pk) 
     return queryset 

Aber das gibt den Fehler:

NameError at /restaurant/1/employees/ 
name 'restaurant' is not defined 
Request Method: GET 
Request URL: http://127.0.0.1:8001/restaurant/1/employees/ 
Django Version: 1.10.5 
Exception Type: NameError 
Exception Value:  
name 'restaurant' is not defined 

ich in meinem views.py einige Varianten für die queryset versucht haben, aber ich kann Es scheint nicht zu funktionieren. Könnte mir jemand helfen, dieses Abfrage-Set zu definieren?

+0

Das Problem ist nicht die queryset, aber Standard-Python-Scoping. Woher soll der Wert für "Restaurant" kommen? –

+0

'Restaurant' wurde in meinem Mitarbeitermodell als Fremdschlüssel für das Modell' RestaurantFeature' definiert, so: 'restaurant = models.ForeignKey (RestaurantFeature, on_delete = models.CASCADE)' –

+0

Aber das beantwortet die Frage nicht ; \ wo ist der * spezifische * Wert, nach dem gefiltert werden soll? –

Antwort

2

Das Problem ist nicht die Abfrage, sondern Standard Python Scoping. Sie müssen darüber nachdenken, woher der Wert für das Restaurant kommen soll.

In Ihrem Fall kommt es eindeutig von der URL; vorausgesetzt, Sie eine URL etwas wie diese:

url(r'^restaurant/(?P<restaurant_id>\d+)/employees/$', ...) 

benannte Gruppe erfassen, wird dieser Wert in self.kwargs['restaurant_id'] gespeichert werden. Also solltest du das im Filter verwenden.

Beachten Sie auch, dass Sie restaurant_id direkt als Feld verwenden können, anstatt ein So

JOIN tun:

queryset = Employee.objects.filter(restaurant_id=self.kwargs['restaurant']) 
+0

Vielen Dank für Ihre ausführliche Antwort. Der Wert für Restaurant kommt tatsächlich von der URL. Entschuldige, dass du das nicht hinzugefügt hast. Die URL-Regex, die ich habe, ist: URL (Restaurant/(? P \ d +)/Mitarbeiter/$ ', EmployeeList.as_view(), Name =' Restaurant_Mitarbeiter ') '. Ich habe deinen Code hinzugefügt, aber das verursacht den Fehler: 'KeyError: 'restaurant''. Können Sie mir erklären, warum das mein Problem immer noch nicht löst? –

+0

Oh, ich habe das Problem gelöst, indem ich deine Antwort noch einmal gelesen habe. Ich habe das 'Restaurant' in' PK' verwandelt! Vielen Dank! –

0

Sie liefern kein Restaurant in das get_queryset. Wahrscheinlich sollte es so sein:

def get_queryset(self): 
     self.restaurant = get_object_or_404(Restaurant, name=self.args[0]) 
     return Emploee.objects.filter(pk=self.restaurant) 
0

dies versuchen -

queryset = Employee.objects.filter(restaurant__pk=pk_value) 

sollten Sie passieren pk_value hier und Restaurant-Feld soll den Fremdschlüssel für andere Tabelle sein. Sie können dies überprüfen, indem Sie in der Shell pk_value = 1 übergeben.

hoffe das hilft. Weitere Informationen finden Sie unter django model docs - https://docs.djangoproject.com/en/1.10/topics/db/models/