Django Todo App-按外键过滤会导致TypeError [英] Django Todo App - Filter by foreign keys results in TypeError
本文介绍了Django Todo App-按外键过滤会导致TypeError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我的模特
from django.contrib.auth.models import User
class Task(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=200)
complete = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
通过以下视图和URL模式,我得到了待办事项:
With the following view and URL pattern I get my the todos:
class TaskView(viewsets.ModelViewSet):
queryset = Task.objects.all() ## get all todos
serializer_class = TaskSerializer
router.register("todos", views.TaskView)
但是,我想要特定所有者的待办事项.我试过了:
However, I want the todos for a specific owner. I tried this:
class TaskView(viewsets.ModelViewSet):
queryset = Task.objects.filter(id=id)
serializer_class = TaskSerializer
router.register("todos/<int:id>", views.TaskView)
这将导致以下错误:
TypeError: Field 'id' expected a number but got <built-in function id>.
使用 get
而不是 filter
会导致相同的问题.为什么会发生此错误,我该如何解决?
using get
instead of filter
resulted in the same problem. Why does this error happen and how can I solve it?
推荐答案
另一种方式:在GET parms中传递所有者ID并对其进行过滤.
Another way: pass owner id in GET parms and filter this.
serializers.py :
class TaskView(viewsets.ModelViewSet):
serializer_class = TaskSerializer
def get_queryset(self):
id = self.request.GET.get('owner_id')
queryset = Task.objects.filter(owner__id=id)
return queryset
urls.py :
router.register("todos", views.TaskView)
在 GET
查询参数中
传递 owner_id .:
这篇关于Django Todo App-按外键过滤会导致TypeError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文