在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中尝试过查询集的一些变体,但我似乎无法让它工作。有人可以帮我定义这个查询集吗?
答案 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/