QuerySet在shell中工作但不在Views.py中工作 - Django 1.10

时间:2017-02-20 11:35:28

标签: python django

在Django shell(python manage.py shell)中执行以下QuerySet时:

Employee.objects.filter(restaurant__pk = 1)

我得到了一个结果:

<QuerySet [<Employee: Joyce McDonnals>]>

请原谅,因为我是Django的新手。我试图通过PK动态地在我的网页中实现这个查询集。我在views.py中定义的get_queryset是:

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

我在views.py中尝试过查询集的一些变体,但我似乎无法让它工作。有人可以帮我定义这个查询集吗?

3 个答案:

答案 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'])

答案 1 :(得分: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)

答案 2 :(得分:0)

试试这个 -

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

你应该在这里传递pk_value而餐厅字段应该是其他表的外键。您可以通过传递pk_value = 1进行检查,就像在shell中一样。

希望这会有所帮助。有关更多信息,请查看django model docs - https://docs.djangoproject.com/en/1.10/topics/db/models/