Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django-Rest-Framework Relationships & Hyperlinked API issues

I am having a go at the django-rest-framework. It was all going fine until I got to the Relationships & Hyperlinked API part of the tutorial. The error I am getting now after messing with it for a bit is:

ImproperlyConfigured at /api/users/ "^\.(?P<format>[a-z0-9]+)\.(?P<format>[a-z0-9]+)$" is not a valid regular expression: redefinition of group name u'format' as group2; was group 1

I tried doing some research into this but can't seem to find anything and more I mess with it the more that goes wrong

Heres my code:

modules.py

class Home(models.Model):
    user = models.ForeignKey(User)
    #address ect

serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer):
    username = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='home-detail')

    class Meta:
        model = User
        fields = ('url', 'username', 'home')


class HomeSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')
    highlight = serializers.HyperlinkedIdentityField(view_name='home-highlight', read_only=True, format='html')

    class Meta:
        model = Home
        fields = ('url', 'owner', 'postcode')

api.py

@api_view(('GET',))
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'homes': reverse('home-list', request=request, format=format)
    })


class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class HomeList(generics.ListCreateAPIView):
    queryset = Home.objects.all()
    serializer_class = HomeSerializer


class HomeDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Home.objects.all()
    serializer_class = HomeSerializer


class HomeHighlight(generics.GenericAPIView):
    queryset = Home.objects.all()
    renderer_classes = (renderers.StaticHTMLRenderer,)

    def get(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

urls.py

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

    url(r'^users/$',
        api.UserList.as_view(),
        name='user-list'),
    url(r'^users/(?P<pk>[0-9]+)/$',
        api.UserDetail.as_view(),
        name='user-detail'),
    url(r'^home/$',
        api.HomeList.as_view(),
        name='home-list'),
    url(r'^home/(?P<pk>[0-9]+)/$',
        api.HomeDetail.as_view(),
        name='home-detail'),
    url(r'^home/(?P<pk>[0-9]+)/highlight/$',
        api.HomeHighlight.as_view(),
        name='home-highlight')
])

urlpatterns += [
    url(r'^api-auth/', include('rest_framework.urls',
                               namespace='rest_framework')),
]

urlpatterns = format_suffix_patterns(urlpatterns)
like image 201
Chris Meek Avatar asked Dec 08 '14 22:12

Chris Meek


People also ask

What is PrimaryKeyRelatedField in Django?

PrimaryKeyRelatedField. PrimaryKeyRelatedField may be used to represent the target of the relationship using its primary key. For example, the following serializer: class AlbumSerializer(serializers. ModelSerializer): tracks = serializers.

What are hyperlinked relations?

hyperlinked relation are just a representation of a relation. It provides an hyperlink (an uri) to fetch the associated object.


1 Answers

You are calling format_suffix_patterns twice, so Django has no idea how to parse the URL because there are two format groups.

You shouldn't need the first call, as the second call takes care of it for you (and allows for TokenAuthentication to still have the suffixes).

like image 144
Kevin Brown-Silva Avatar answered Sep 27 '22 01:09

Kevin Brown-Silva