2

I'm getting the error

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

Here is a MWE:

urls.py:

from django.contrib import admin
from django.urls import include, path

from rest_framework import routers
from testproj import views

router = routers.DefaultRouter()
router.register(r'taxonomy', views.TaxonomyViewSet)
router.register(r'taxonomy-term', views.TaxonomyTermViewSet)

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

models.py:

from django.db import models

class Taxonomy(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    slug = models.SlugField()

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Taxonomy"
        verbose_name_plural = "Taxonomies"

class TaxonomyTerm(models.Model):
    taxonomy = models.ForeignKey(
        "Taxonomy",
        on_delete=models.CASCADE,
        related_name="terms",
        related_query_name="term"
    )
    parent = models.ForeignKey(
        "self",
        on_delete=models.CASCADE,
        related_name="children",
        related_query_name="child",
        blank=True,
        null=True
    )
    name = models.CharField(max_length=255,)
    description = models.TextField()
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Term"
        verbose_name_plural = "Terms"

serializers.py:

from testproj.models import TaxonomyTerm, Taxonomy
from rest_framework import serializers

class TaxonomySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Taxonomy
        fields = ('name', 'description', 'slug')
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }


class TaxonomyTermSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = TaxonomyTerm
        fields = ('taxonomy', 'parent', 'name', 'description', 'slug')
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

views.py

from rest_framework import viewsets
from testproj.models import Taxonomy, TaxonomyTerm
from testproj.serializers import TaxonomySerializer, TaxonomyTermSerializer

class TaxonomyViewSet(viewsets.ModelViewSet):
    queryset = Taxonomy.objects.all().order_by('name')
    serializer_class = TaxonomySerializer
    lookup_field = 'slug'


class TaxonomyTermViewSet(viewsets.ModelViewSet):
    queryset = TaxonomyTerm.objects.all().order_by('name')
    serializer_class = TaxonomyTermSerializer
    lookup_field = 'slug'

What on earth is going on? I've looked through many similar questions, and I can't see that I'm making any of the usual mistakes.

C. E.
  • 10,297
  • 10
  • 53
  • 77

1 Answers1

5

The TaxonomyTermSerializer doesn't provide the lookup_field for the parent hyperlink, nor for taxonomy one.

It should work with:

class TaxonomyTermSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = TaxonomyTerm
        fields = ('taxonomy', 'parent', 'name', 'description', 'slug')
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'},
            'taxonomy': {'lookup_field': 'slug'},
            'parent': {'lookup_field': 'slug'},
        }
Linovia
  • 19,812
  • 4
  • 47
  • 48