当我尝试访问名为
/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
的客户模型类。
提前致谢!