Django Rest-Framework`配置不当-无法使用视图名称“<model>:detail”解析超链接关系的URL`

问题描述 投票:0回答:0

当我尝试访问名为

/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.

我尝试了很多网上看到的解决方案,但没有一个有效:

Django Rest Framework - 无法使用视图名称“用户详细信息”解析超链接关系的 URL

Django Rest Framework,查找字段配置不当

您可能没有在您的 API 中包含相关模型,或者在此字段上错误地配置了

lookup_field
属性

DRF 无法使用 PrimaryKeyRelatedField 上的视图名称解析超链接关系的 URL

对于上下文,每个客户端都是一个用户(django 用户),要知道一个用户是否是客户端,它必须在我的数据库中的表 client 中。 所以我想当我使用端点

/clients/
时获得有关链接到的用户的信息 客户端(我使用这个系统是因为我将有两种类型的用户,第二种还没有创建)。

有我的代码:

用户/模型.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

用户/序列化程序.py:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'mail')
        lookup_field = 'username'

用户/views.py:

class UserViews(viewsets.ModelViewSet):
    queryset = User.object.all()
    serializer_class = UserSerializer
    lookup_field = 'username'

客户/模型.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')

客户/意见:

class ClientViewSets(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    lookup_field = 'user__username'

客户端/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)
]

注意:我每次都通过from django.contrib.auth.models imposer User导入

User
模型,除了我使用Django建议的
settings.AUTH_USER_MODEL
的客户模型类。

提前致谢!

django django-models django-rest-framework django-views django-serializer
© www.soinside.com 2019 - 2024. All rights reserved.