2017-02-20 4 views
1

При выполнении следующей QuerySet в оболочке Django (python manage.py shell):QuerySet работает в оболочке, но не в views.py - Джанго 1,10

Employee.objects.filter(restaurant__pk = 1) 

я получаю результат обратно:

<QuerySet [<Employee: Joyce McDonnals>]> 

Пожалуйста извините, потому что я новичок в Django. Я пытаюсь выполнить этот запрос в динамическом режиме на моей веб-странице через ПК. get_queryset который я определил в views.py является:

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 

Но это возвращает ошибку:

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 

Я пробовал несколько вариантов для QuerySet в моем views.py, но я могу Кажется, он работает. Может ли кто-нибудь помочь мне определить этот запрос?

+0

Проблема не QuerySet, но стандартный Python обзорное. Откуда стоит стоимость «ресторана»? –

+0

'restaurant' был определен в моей модели Employee как иностранный ключ к модели' RestaurantFeature', например: 'restaurant = models.ForeignKey (RestaurantFeature, on_delete = models.CASCADE)' –

+0

Но это не отвечает на вопрос ; \ где - значение * *, которое вы хотите отфильтровать? –

ответ

2

Проблема не в наборе запросов, а в стандартном охвате Python. Вам нужно подумать о том, откуда должна идти стоимость ресторана.

В вашем случае это, очевидно, происходит из URL-адреса; если у вас есть URL-адрес что-то вроде этого:

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

назвал захват группы, то это значение будет храниться в self.kwargs['restaurant_id']. Поэтому вы должны использовать это в фильтре.

Заметим также, что вы можете использовать restaurant_id непосредственно в поле, а не делать JOIN

Итак:

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

Благодарим вас за подробный ответ. Значение для ресторана действительно исходит из URL-адреса. Извините, что не добавлял это. Регулярное выражение url, которое у меня есть: 'url (r '^ restaurant/(? P \ d +)/сотрудники/$', EmployeeList.as_view(), name = 'restaurant_employee')'. Я добавил ваш код, но это вызывает ошибку: «KeyError:« ресторан ». Не могли бы вы объяснить, как это все еще не разрешает мою проблему? –

+0

О, я решил проблему, снова прочитав ваш ответ. я изменил «ресторан» на 'pk'! Большое спасибо! –

0

Вы не предоставляете ресторан в get_queryset. Вероятно, это должно быть так:

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

попробовать это -

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

вы должны пройти pk_value здесь и поле ресторан должен быть внешний ключ другой таблицы. Вы можете проверить, передав pk_value = 1, как вы это делаете в оболочке.

надеюсь, что это поможет. для дополнительной информации django docs docs - https://docs.djangoproject.com/en/1.10/topics/db/models/

Смежные вопросы