I have this exception when I try to access to the endpoint named /clients/
:
django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "client-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.
I have tried a lot of solutions seen online, but no one works :
Django Rest Framework, improperly configured lookup field
DRF Could not resolve URL for hyperlinked relationship using view name on PrimaryKeyRelatedField
For the context, each client is a user (django user) and to know if a user is a client, it has to be in the table client in my database.
So I want when I use the endpoint /clients/
to have informations about the user linked to
the client (I use this system because I will have two types of user, the 2th isn't created yet).
There is my code :
user/models.py :
class UserManager(BaseUserManager):
use_in_migration = True
def create_user(self, mail, name, lastname, password=None):
if not name or not lastname or not mail:
raise ValueError("y pas tout")
user = self.model(mail=self.normalize_email(mail), lastname=lastname, name=name)
user.set_password(password)
user.save(using=self._db)
return user
def create_staffuser(self, mail, name, lastname, password):
user = self.create_user(mail, name, lastname, password=password)
user.staff = True
user.save(using=self._db)
return user
def create_superuser(self, mail, name, lastname, password):
user = self.create_user(mail, name, lastname, password=password)
user.staff = True
user.admin = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
mail = models.EmailField(verbose_name='email address', max_length=255, unique=True)
name = models.CharField(max_length=50)
lastname = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
object = UserManager()
USERNAME_FIELD = 'mail'
REQUIRED_FIELDS = ['name', 'lastname']
def get_full_name(self):
return self.mail
def get_short_name(self):
return self.mail
def has_perm(self, perm, obj=None):
return True
def has_module_perm(self, app_label):
return True
def __str__(self):
return self.mail
@property
def is_staff(self):
return self.staff
@property
def is_adin(self):
return self.admin
user/serializers.py :
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'mail')
lookup_field = 'username'
user/views.py :
class UserViews(viewsets.ModelViewSet):
queryset = User.object.all()
serializer_class = UserSerializer
lookup_field = 'username'
client/models.py :
User = settings.AUTH_USER_MODEL
class Client(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
@property
def user__username(self):
return self.user.username
def __unicode__(self):
return self.user.username
client/serializers.py :
class ClientSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.HyperlinkedRelatedField(read_only=True, view_name='user-detail', lookup_field='username')
class Meta:
model = Client
lookup_field = 'user__username'
fields = ('url', 'user')
client/views :
class ClientViewSets(viewsets.ModelViewSet):
queryset = Client.objects.all()
serializer_class = ClientSerializer
lookup_field = 'user__username'
client/urls.py :
router = routers.DefaultRouter()
router.register(r'clients', views.ClientViewSets, basename='client')
urlpatterns = [
path('', include(router.urls))
]
project/urls.py :
urlpatterns = [
path('', include(('client.urls', 'client'), namespace='client')),
path('admin/', admin.site.urls)
]
Note : I import each time the User models via from django.contrib.auth.models imposer User
except for the models class of client where I use settings.AUTH_USER_MODEL
adviced by Django.
Thanks in advance !