Django REST - 如何正确配置 URL lookup_field?
Django REST - How do I correctly configure URLs lookup_field?
我已经做了几个 django 项目,现在正在试验 rest 框架。我正在尝试配置我的 url,这样 url /testuser/
会将您带到用户名为 'testuser' 的用户的个人资料页面。我可以使用 slug_field
在常规 django 中管理非常简单的任务,但我想我不太了解如何正确配置 REST urls。任何帮助表示赞赏。下面的代码。
仅供参考,正如您将在下面看到的,我正在使用 CustomUser
模型,通过 OneToOneField
链接到 Profile
模型。用户名存储在 CustomUser
模型中。但是,个人资料页面将使用 ProfileSerializer
.
填充
我认为问题可能是我从相关模型 CustomUser 访问 'username' 的方式 - 但我可能是错的(很可能,哈哈)。有人知道吗?
我当前的代码抛出错误:
Expected view ProfileView to be called with a URL keyword argument named "username". Fix your URL conf, or set the .lookup_field attribute on the view correctly.
users.models
class CustomUser(AbstractBaseUser):
username = models.CharField(
verbose_name='username',
max_length=40,
unique=True,
)
...
profiles.models
class Profile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='profile'
)
...
profiles.serializers
class ProfileSerializer(serializers.ModelSerializer):
username = serializers.CharField(read_only=True, source="user.username")
class Meta:
fields = ('username', 'display_name', 'profile_pic',
'bio', 'following', 'modified', 'est', )
model = Profile
lookup_field = 'username'
profiles.views
class ProfileView(generics.RetrieveUpdateAPIView):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
lookup_field = 'username'
profiles.urls
urlpatterns = [
path('<str:slug>/', PostDetail.as_view(), name='self_profile'),
]
感谢您的帮助。
您的视图需要 username
URL 参数,但它接收到 slug
。您可以更改 URL 以传递 username
而不是 slug,或者在您的视图中将 lookup_url_kwarg
设置为 slug
以解决该问题。
我已经做了几个 django 项目,现在正在试验 rest 框架。我正在尝试配置我的 url,这样 url /testuser/
会将您带到用户名为 'testuser' 的用户的个人资料页面。我可以使用 slug_field
在常规 django 中管理非常简单的任务,但我想我不太了解如何正确配置 REST urls。任何帮助表示赞赏。下面的代码。
仅供参考,正如您将在下面看到的,我正在使用 CustomUser
模型,通过 OneToOneField
链接到 Profile
模型。用户名存储在 CustomUser
模型中。但是,个人资料页面将使用 ProfileSerializer
.
我认为问题可能是我从相关模型 CustomUser 访问 'username' 的方式 - 但我可能是错的(很可能,哈哈)。有人知道吗?
我当前的代码抛出错误:
Expected view ProfileView to be called with a URL keyword argument named "username". Fix your URL conf, or set the .lookup_field attribute on the view correctly.
users.models
class CustomUser(AbstractBaseUser):
username = models.CharField(
verbose_name='username',
max_length=40,
unique=True,
)
...
profiles.models
class Profile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='profile'
)
...
profiles.serializers
class ProfileSerializer(serializers.ModelSerializer):
username = serializers.CharField(read_only=True, source="user.username")
class Meta:
fields = ('username', 'display_name', 'profile_pic',
'bio', 'following', 'modified', 'est', )
model = Profile
lookup_field = 'username'
profiles.views
class ProfileView(generics.RetrieveUpdateAPIView):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
lookup_field = 'username'
profiles.urls
urlpatterns = [
path('<str:slug>/', PostDetail.as_view(), name='self_profile'),
]
感谢您的帮助。
您的视图需要 username
URL 参数,但它接收到 slug
。您可以更改 URL 以传递 username
而不是 slug,或者在您的视图中将 lookup_url_kwarg
设置为 slug
以解决该问题。