【问题标题】:Could not resolve URL for hyperlinked relationship using view name "place-info".无法使用视图名称“place-info”解析超链接关系的 URL。
【发布时间】:2017-07-22 11:54:12
【问题描述】:

我为这个问题搜索了很多,但没有任何解决方案适合我。我得到无法使用视图名称“place-info”解析超链接关系的 URL。您可能没有在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field 属性。当我想通过我在 django 中的 API 访问此资源时。

我收到这样的错误:

Could not resolve URL for hyperlinked relationship using view name "place-info". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

我的模型如下:

class TourSite(models.Model):
"""Destination place"""

place_name = models.CharField(max_length=100, blank=False, default='')
place_address = models.CharField(max_length=200, blank=False, default='')
place_image = models.ImageField(upload_to="TourSite", blank=True)

def get_place_name(self):
    return self.place_name

def get_place_address(self):
    return self.place_address

def save(self, *args, **kwargs):
    super(TourSite, self).save(*args, **kwargs)

def __str__(self):
    return self.place_name

class Info(models.Model):
"""Stores information about the place."""
place_name = models.OneToOneField(
        TourSite,
        on_delete = models.CASCADE,
        primary_key = True,
    )

famous_for = models.CharField(max_length=200, blank=True, default='')
brief_info = models.TextField(blank=True, default='')

def get_famous_for(self):
    return self.famous_for

def get_brief_info(self):
    return self.brief_info

def get_place_name(self):
    return self.place_name

def save(self, *args, **kwargs):
    super(Info, self).save(*args, **kwargs)

def __str__(self):
    return "%s is famous for %s"% (self.place_name, self.famous_for)

我的Serailizer:

class InfoSerializer(serializers.ModelSerializer):

class Meta:
    model = Info
    fields = '__all__'

class TourSiteSerializer(serializers.HyperlinkedModelSerializer):
    place_info = serializers.HyperlinkedIdentityField(view_name='place-info')

class Meta:
    model = TourSite
    fields = ('id', 'place_name','place_info', 'place_address', 'place_image')

我的看法:

@api_view(['GET'])
def api_root(request):
return Response({
        'places': reverse('places-list', request=request),
    })


class TourSiteList(DefaultsMixin, generics.ListAPIView):
   queryset = TourSite.objects.all()
   search_fields = ("place_name", "place_address", )
   serializer_class = TourSiteSerializer



class TourSiteDetail(DefaultsMixin, generics.RetrieveUpdateDestroyAPIView):
queryset = TourSite.objects.all()
serializer_class = TourSiteSerializer


class Info(generics.ListAPIView):
queryset = Info.objects.all()
serializer_class = InfoSerializer

我的网址

urlpatterns = [
url(r'^$', views.api_root),

url(r'^places/$', views.TourSiteList.as_view(), name="places-list"),
url(r'^places/(?P<pk>[0-9]+)/$', views.TourSiteDetail.as_view(), name="places-detail"),

url(r'^info/$', views.Info.as_view(), name='place-info'),
]

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    因为我不能评论:

    您的class Meta 类有错误的缩进。它们应该在相应的类中缩进。如果只是转录错误,则应针对问题进行修复。

    【讨论】:

    • 我已经更正了我的代码中的缩进。尽管出现错误,但缩进仅在此处变形。
    【解决方案2】:

    我遇到过类似的情况,涉及 HyperlinkedRelatedField 上的 OneToOneField,这是一个模型的主键。

    最终需要为HyperlinkedRelatedField 指定lookup_fieldlookup_url_kwarg 参数。

    以下是此解决方案应用于您的序列化程序时的样子:

    class TourSiteSerializer(serializers.HyperlinkedModelSerializer):
        place_info = serializers.HyperlinkedIdentityField(
            view_name='place-info',
            lookup_field='place_info_id',      # <-- note the `_id` suffix
            lookup_url_kwarg='place_info',
        )
    
        class Meta:
            model = TourSite
            fields = ('id', 'place_name','place_info', 'place_address', 'place_image')
    

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 2021-07-10
      • 2021-01-25
      • 2018-11-22
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      相关资源
      最近更新 更多