0

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 - Could not resolve URL for hyperlinked relationship using view name "user-detail"

Django Rest Framework, improperly configured lookup field

You may have failed to include the related model in your API, or incorrectly configured the lookup_field attribute on this 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 !

Machigan
  • 17
  • 7

0 Answers0