【问题标题】:Django REST Framework hyperlink URL failing to resolveDjango REST Framework 超链接 URL 无法解析
【发布时间】:2016-04-25 07:10:56
【问题描述】:

我正在尝试在我的 Django REST Framework API 中设置超链接,但我终其一生都找不到错误所在。

我的模特:

class Franchise(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    # Other fields

我的序列化器

class FranchiseListSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='franchise_details',
        lookup_field='id',
        lookup_url_kwarg='franchiseid'
    )

    class Meta:
        model = Franchise
        fields = ('id', 'name', 'url')

我的网址:

url(r'^db/franchise/$', views.franchise_index, name='db_franchise_index'),
url(r'^db/franchise/(?P<franchiseid>[0-9]+)/$', views.franchise_details, name='db_franchise_details')

请注意,这是一个包含的 url conf,我所有的 api 功能都在 /api/ url 中

我的看法:

@api_view(['GET'])
def franchise_index(request, format=None):
    franchise_list = Franchise.objects.all()
    serializer = FranchiseListSerializer(franchise_list, many=True, context={'request': request})
    return Response(serializer.data)

@api_view(['GET'])
def franchise_details(request, franchiseid, format=None):
    franchise = Franchise.objects.get(id=franchiseid)
    serializer = FranshiseDetailSerializer(franchise)
    return Response(serializer.data)

请注意,上面看到的FranshiseDetailSerializer 工作正常。

总结:

  • URL /api/db/franchise/ 转到视图franchise_index,该视图返回由FranchiseListSerializer 序列化的数据。
  • URL /api/db/franchise/&lt;franchiseid&gt;/ 转到视图franchise_details,它返回由FranchiseDetailSerializer 序列化的数据(工作正常)

如您所见,我在FranchiseListSerializer 中添加了一个url 字段,我应该将其链接到相应的特许经营详情页面。在我添加 url 字段之前,序列化程序只返回了idname,这是当时正确且预期的行为。

当我现在转到 /api/db/franchise/ 时,我收到错误:

ImproperlyConfigured at /api/db/franchise/
Could not resolve URL for hyperlinked relationship using view name "franchise_details". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

根据这个提示,我在FranchiseListSerializerurl 字段中设置了参数,据我所知,它们是正确的。我检查并仔细检查了 DRF 文档,hereherehere,但没有找到解决方案。

根据 Stackoverflow 上的其他类似问题,我尝试将 view_name='franchise_details' 更改为 view_name='api:franchise_details'(相关文件所在的 Django 应用程序的名称)和 view_name='api:franchise_details-detail',但无济于事。

感谢您的任何帮助,干杯。

【问题讨论】:

  • 在 urls 中有 view_name 'db_franchise_details' 但在序列化程序中有 'franchise_details' 因此不匹配。
  • 啊,文档似乎另有说明,至少我是如何阅读的。干杯

标签: python django rest serialization django-rest-framework


【解决方案1】:

感谢@AKS 的提示,我想通了。 view_name 实际上是 URL 的名称,而不是视图。从我阅读文档的方式来看(事实上它是view_name 而不是url_name),似乎说它应该是视图的名称。

我之前实际上曾尝试过使用view_name='db_franchise_details'(我的网址名称),但这不起作用。在 AKS 用该评论提示我之后,我再次尝试,还尝试使用 view_name='api:db_franchise_details',它确实有效!

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2019-08-20
    • 2020-07-30
    • 2018-06-29
    • 2015-01-15
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多