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 以解决该问题。