我在Django 睡觉框架建设一个项目,用户可以登录查看他们的wine 窖. 我的ModelViewSet工作得很好,突然间我收到了这个令人沮丧的错误:

无法使用视图名称"User-Detail"解析超链接关系的URL.您可能未能在API中包含相关型号,或在此字段上错误配置了lookup_field属性.

回溯显示:

    [12/Dec/2013 18:35:29] "GET /bottles/ HTTP/1.1" 500 76677
Internal Server Error: /bottles/
Traceback (most recent call last):
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/viewsets.py", line 78, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 399, in dispatch
    response = self.handle_exception(exc)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 396, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/mixins.py", line 96, in list
    return Response(serializer.data)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 535, in data
    self._data = [self.to_native(item) for item in obj]
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 325, in to_native
    value = field.field_to_native(obj, field_name)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 153, in field_to_native
    return self.to_native(value)
  File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 452, in to_native
    raise Exception(msg % view_name)
Exception: Could not resolve URL for hyperlinked relationship using view 
name "user-detail". You may have failed to include the related model in 
your API, or incorrectly configured the `lookup_field` attribute on this 
field.

我有一个自定义的邮箱用户模型和模型中的瓶子模型.py是:

class Bottle(models.Model):    
      wine = models.ForeignKey(Wine, null=False)
      user = models.ForeignKey(User, null=False, related_name='bottles')

我的序列化程序:

class BottleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Bottle
        fields = ('url', 'wine', 'user')

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('email', 'first_name', 'last_name', 'password', 'is_superuser')

我的看法是:

class BottleViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows bottles to be viewed or edited.
    """
    queryset = Bottle.objects.all()
    serializer_class = BottleSerializer

class UserViewSet(ListCreateAPIView):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer

最后是url:

router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')

urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    # ...

我没有用户详细信息视图,也看不出这个问题可能来自哪里.有什么主意吗?

谢谢

推荐答案

因为它是HyperlinkedModelSerializer,所以序列化程序正在try 解析Bottle上相关User的URL

  1. 向路由注册UserViewSet不就能解决您的问题吗?
  2. 您可以在BottleSerializer上定义用户字段以显式使用UserSerializer,而不是try 解析URL.请看serializer docs on dealing with nested objects for that.

Django相关问答推荐

我找不到为什么我的DRF登录测试没有按预期工作

SQLite上可以正常使用Many2Many链接注释,但MariaDB上无法正常使用(生产环境)

自定义身份验证 django

Django如何在没有ctrl点击的情况下允许多选

如何在两个字段上查找 django 模型的副本?

为什么我的搜索功能返回错误相关字段查找无效:​​类别

Django中的多对多关系?

使用 Vagrant 进行端口转发时连接重置

使用基于类的 UpdateView 在 Django 中更新用户模型

可以在基于 Django 类的视图中设置实例变量吗?

Django BigInteger自动增量字段作为主键?

重命名 django 元素的简单方法

Django 模板列表的第一个元素

ImportError:升级到 Django 4.0 后无法从 'django.conf.urls' 导入名称 'url'

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

如何在不发送信号的情况下保存模型?

如何在不同的元素上添加注释?

如何在 Django 中使用动态外键?

在 Django 中查询 top x 元素

将 AND 和 OR 与 Q 对象组合的 Django 查询过滤器不返回预期结果