【问题标题】:Django Todo App - Filter by foreign keys results in TypeErrorDjango Todo App - 按外键过滤导致 TypeError
【发布时间】:2021-04-23 05:40:09
【问题描述】:

这是我的模型:

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 模式,我得到了我的待办事项:

class TaskView(viewsets.ModelViewSet):
    queryset = Task.objects.all() ## get all todos
    serializer_class = TaskSerializer

router.register("todos", views.TaskView)

但是,我想要特定所有者的待办事项。我试过这个:

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 会导致同样的问题。为什么会出现这个错误,我该如何解决?

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    另一种方式:在 GET 参数中传递所有者 ID 并过滤它。

    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。 :

    http://127.0.0.1:8000/todos/?owner_id=1

    【讨论】:

      【解决方案2】:

      你的模型是:

      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
      

      因此,如果您需要特定所有者的所有任务,您的查询应该是:

      Task.objects.filter(owner__id=id)
      

      考虑id是用户的pk。

      【讨论】:

      • 加上查询需要在视图的get_queryset 方法中而不是直接在类上。 (正如错误描述的那样,id 只是这里的内置 id)
      猜你喜欢
      • 2013-09-04
      • 2012-12-15
      • 2012-07-15
      • 2021-06-25
      • 1970-01-01
      • 2018-12-29
      • 2012-07-30
      • 2020-09-07
      • 2012-01-23
      相关资源
      最近更新 更多