【问题标题】:Incorrect view name for nested hyperlinks using drf-nested-routers使用 drf-nested-routers 的嵌套超链接的视图名称不正确
【发布时间】:2021-04-18 18:36:40
【问题描述】:

我正在尝试使用 drf-nested-routers 创建一个简单的嵌套 Django REST API,给定以下模型:

# models.py
class Podcast(models.Model):
    title = models.CharField(max_length=125)

class Episode(models.Model):
    podcast = models.ForeignKey(Podcast, on_delete=models.CASCADE)
    title = models.CharField(max_length=125)

基于readme domains/nameservers example,我定义了以下路由器,期望 URL 结构如下:

/podcasts[/{podcast_pk}[/episodes[/{episode_pk}]]]
# urls.py
router = routers.DefaultRouter()
router.register(r'podcasts', PodcastViewSet)

episode_router = routers.NestedDefaultRouter(
    router, r'podcasts', lookup='podcast'
)
episode_router.register(
    r'episodes', EpisodeViewSet, basename='podcast-episodes'
)
# serializers.py
class PodcastSerializer(HyperlinkedModelSerializer):
    episodes = HyperlinkedIdentityField(
        view_name='podcast-episodes-list',
        lookup_url_kwarg='podcast_pk'
    )

    class Meta:
        model = Podcast
        fields = '__all__'

class EpisodeSerializer(NestedHyperlinkedModelSerializer):
    parent_lookup_kwargs = {
        'podcast_pk': 'podcast__pk',
    }

    class Meta:
        model = Episode
        fields = '__all__'
        # exclude = ('url',) # works without reference to self
# views.py
class PodcastViewSet(viewsets.ModelViewSet):
    queryset = Podcast.objects.all()
    serializer_class = PodcastSerializer

class EpisodeViewSet(viewsets.ModelViewSet):
    serializer_class = EpisodeSerializer

    def get_queryset(self):
        return Episode.objects.filter(
            podcast=self.kwargs['podcast_pk'],
        )

访问/podcasts/1/episodes/,当包含url时,会引发以下错误:

Exception Type: ImproperlyConfigured at /podcasts/1/episodes/
Exception Value: Could not resolve URL for hyperlinked 
relationship using view name "episode-detail". You may 
have failed to include the related model in your API, 
or incorrectly configured the `lookup_field` attribute 
on this field.

为什么它不能识别正确的视图名称,或者我还缺少其他明显的东西

【问题讨论】:

    标签: django-rest-framework drf-nested-routers


    【解决方案1】:

    在我的情况下,使用 'id' 而不是 'pk' 解决了我的问题。

    parent_lookup_kwargs = {
        'podcast_pk': 'podcast_id',
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2020-11-15
      • 1970-01-01
      • 2014-04-07
      • 2022-06-22
      • 2015-11-24
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多