【问题标题】:Django AssertionError at urlDjango AssertionError 在 url
【发布时间】:2016-03-06 10:49:39
【问题描述】:

在学习 Django REST 框架时,我遇到了 AssertionError at /tasks/1 错误

应使用名为“pk”的 URL 关键字参数调用视图 TaskDetail。修复您的 URL 配置,或正确设置视图上的 .lookup_field 属性。

我的模型.py

class Task(models.Model):
    owner=models.ForeignKey('auth.User',related_name='tasks')
    completed=models.BooleanField(default=False)
    title=models.CharField(max_length=100)
    description=models.TextField()

serializer.py

class TaskSerializer(serializers.ModelSerializer):

class Meta:
    model = Task
    read_only=('owner.username',)
    fields=('title','description','completed','owner.username')

permission.py

class IsOwnerOrReadOnly(BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method is SAFE_METHODS:
            return True

        return obj.owner==request.user

views.py

class TasksMixins(object):
    queryset = Task.objects.all()
    serializer_class=TaskSerializer
    permission_classes=(IsOwnerOrReadOnly,)

    def pre_save(self,obj):
        obj.owner=self.request.user

class TaskList(TasksMixins,ListCreateAPIView):
    pass

class TaskDetail(TasksMixins,RetrieveUpdateDestroyAPIView):
    pass

网址.py

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^tasks/$', views.TaskList.as_view(), name='task_list'),
    url(r'^tasks/(?P<id>[0-9]+)$', views.TaskDetail.as_view(), name='task_detail')
]

追溯

Traceback (most recent call last):
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/rest_framework/views.py", line 466, in dispatch
    response = self.handle_exception(exc)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/rest_framework/views.py", line 463, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/rest_framework/generics.py", line 286, in get
    return self.retrieve(request, *args, **kwargs)
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/rest_framework/mixins.py", line 56, in retrieve
    instance = self.get_object()
  File "/home/amogh/PycharmProjects/env_1.9/local/lib/python2.7/site-packages/rest_framework/generics.py", line 93, in get_object
    (self.__class__.__name__, lookup_url_kwarg)
AssertionError: Expected view TaskDetail to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.

当我导航到该链接时,我会收到此错误

非常感谢任何帮助...谢谢您

error image

【问题讨论】:

  • 在 urls.py 第 4 行,将 &lt;id&gt; 更改为 &lt;pk&gt;。您正在传递一个pk kwarg,但该网址需要一个id kwarg。 Django 约定使用 pk 而不是 id。
  • @Bjorn....感谢您的回复...但获取 字段名称owner.username 对模型Task 无效。 错误
  • 因为它不是Task 字段。查看该字段的源参数

标签: python django django-rest-framework


【解决方案1】:

如果您想通过 'pk' 定位,只需将 id -> pk 重命名为您的 url.py:

url(r'^tasks/(?P&lt;pk&gt;[0-9]+)$', views.TaskDetail.as_view(), name='task_detail')

如果您想通过 pk 以外的其他字段作为目标,您必须调整 url.py、view.py 和 serializer.py 精确查找字段(可以嵌套)例如,它可能适合您.

url.py:

url(r'^tasks/(?P<owner__username>[0-9]+)$', views.TaskDetail.as_view(), name='task_detail')

view.py:

class TasksMixins(object):
    queryset = Task.objects.all()
    serializer_class=TaskSerializer
    permission_classes=(IsOwnerOrReadOnly,)
    lookup_field = 'owner__username'

serializer.py

class TaskSerializer(serializers.ModelSerializer):
    owner = serializers.SlugRelatedField(slug_field='username',many=False, read_only=True)
    class Meta:
        model = Task
        fields='__all__'
        lookup_field = 'owner__username'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2016-06-02
    相关资源
    最近更新 更多