【问题标题】:Django Rest Framework Reverse() Method FailsDjango Rest Framework Reverse() 方法失败
【发布时间】:2026-01-24 18:05:01
【问题描述】:

我的主要 urls.py 位于此处 ahlami -> ahlami -> urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/accounts/', include('accounts.api.urls')),
]

我的帐户应用程序 urls.py 位于此处 ahlami -> 帐户 -> api -> urls.py

urlpatterns = [
    path('users/<int:pk>/', views.UserView.as_view(), name='user-detail')
]

我的一个帐户views.py 返回

token = Token.objects.create(......)
return Response(data=AnonymousUserTokenResponseSerializer(instance=token).data)

我的令牌模型只有三个字段。为简单起见,我在下面列出了一个字段

class Token(rest_framework.authtoken.models.Token):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE

AnonymousUserTokenResponseSerializer 链接到 Token 模型,返回三个 json 属性

class AnonymousUserTokenResponseSerializer(serializers.ModelSerializer):
    user_id = serializers.ReadOnlyField(source='user.id')
    user_url = reverse(viewname='user-detail')
    class Meta:
        model = Token
        fields = ('key',
                  'user_id',
                  'user_url')

AnonymousUserTokenResponseSerializer 失败,因为它无法识别 reverse()

user_url = reverse(viewname='user-detail')

python manage.py runserver 因为上面的那行而抛出下面的错误

django.core.exceptions.ImproperlyConfigured:包含的 URLconf 'ahlami.urls' 中似乎没有任何模式。如果你看到 文件中的有效模式,那么问题可能是由 循环导入。

我的设置位于 ahlami -> ahlami -> settings -> base.py 和 base.py 有这个

ROOT_URLCONF = 'ahlami.urls'

我希望得到一个看起来像但由于上述错误而无法得到的输出。

{
    "key": "891e388399f2fcae016fe6887107034239041478",
    "user_id": 29,
    "user_url": http://localhost/api/accounts/users/29 
}

我怎样才能解决这个错误并使 reverse() 工作?

django.core.exceptions.ImproperlyConfigured:包含的 URLconf 'ahlami.urls' 中似乎没有任何模式。如果你看到 文件中的有效模式,那么问题可能是由 循环导入。

【问题讨论】:

  • user_url 放入序列化程序没有任何意义,因为它不是序列化程序字段
  • 什么意思?你的意思是 user_url 不是 Token 的一部分吗? user_id 也不是序列化程序的一部分。我声明了 user_id 并且它起作用了。
  • user_idDRF 序列化器字段,但 user_url 不是

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


【解决方案1】:

使用serializers.HyperlinkedIdentityField

class AnonymousUserTokenResponseSerializer(serializers.ModelSerializer):
    user_id = serializers.ReadOnlyField(source='user.id')
    user_url = serializers.HyperlinkedIdentityField(
        view_name='user-detail',
        source='user.id',
        lookup_field='pk'
    )

    class Meta:
        model = Token
        fields = ('key', 'user_id', 'user_url')

【讨论】:

  • 完美!有效。谢谢Arakkal...我不得不做一些改变。我必须在我的序列化程序的方法 return Response(data=AnonymousUserTokenResponseSerializer(instance=token, context={'request': request}).data) 中传递上下文,我必须将 serializers.HyperlinkedIdentityField 更改为 serializers.HyperlinkedRelatedField user_url = serializers.HyperlinkedRelatedField( view_name='user-detail', source='user.id', lookup_field='pk', read_only='True' )
  • 只是想了解为什么我必须通过 return context={'request': request}。如果您有任何想法,请随时在这里分享。无论如何,我会谷歌它。
  • 因为,DRF 在内部使用请求对象来构建 URL
最近更新 更多