django rest framework lookup_field a través de OneToOneField

https://gist.github.com/ranman/3d97ea9054c984bca75e

Comportamiento deseado
La búsqueda de usuarios se realiza con el nombre de usuario: /api/users/randall
La búsqueda de los /api/speakers/randall también ocurre con el nombre de usuario: /api/speakers/randall

Restricciones
No todos los usuarios son oradores. Todos los ponentes son usuarios.

modelos.py

 from django.contrib.auth.models import User class Speaker(models.Model): user = models.OneToOneField(User) 

serializers.py

 class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'groups') lookup_field = 'username' class SpeakerSerializer(serializers.HyperlinkedModelSerializer): user = serializers.HyperlinkedRelatedField( view_name='user-detail', read_only=True, lookup_field='username' ) class Meta: model = Speaker lookup_field = 'user' 

vistas.py

 class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer lookup_field = 'username' class SpeakerViewSet(viewsets.ModelViewSet): queryset = Speaker.objects.all().select_related('user') serializer_class = SpeakerSerializer lookup_field = "user" 

He intentado varias invocaciones diferentes de lookup_field y los tipos de serializador para que esto funcione en vano. Puede que no sea posible sin mucho más código. Me pregunto qué dirección puedo tomar.

¡Gracias!

Así es como logré hackearlo.

modelos.py

 from django.db import models from django.contrib.auth.models import User class Speaker(models.Model): user = models.OneToOneField(User) @property def user__username(self): return self.user.username def __unicode__(self): return self.user.username 

serializers.py

 from .models import Speaker from rest_framework import serializers from django.contrib.auth.models import User class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'groups') lookup_field = 'username' class SpeakerSerializer(serializers.HyperlinkedModelSerializer): user = serializers.HyperlinkedRelatedField( view_name='user-detail', read_only=True, lookup_field='username' ) class Meta: model = Speaker fields = ('url', 'user') lookup_field = 'user__username' 

ver.py

 from .models import Speaker from .serializers import SpeakerSerializer, UserSerializer from rest_framework import viewsets from django.contrib.auth.models import User class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer lookup_field = 'username' class SpeakerViewSet(viewsets.ModelViewSet): queryset = Speaker.objects.all().select_related('user') serializer_class = SpeakerSerializer lookup_field = 'user__username' 

¿Has probado este enfoque?

 class SpeakerViewSet(viewsets.ModelViewSet): queryset = Speaker.objects.all().select_related('user') serializer_class = SpeakerSerializer filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('user', 'user__username',)