尝试传递一个字符串以通过 Django Rest Framework url 进行查询

Posted

技术标签:

【中文标题】尝试传递一个字符串以通过 Django Rest Framework url 进行查询【英文标题】:Trying to pass a string for querying through Django Rest Framework urls 【发布时间】:2019-06-03 20:05:55 【问题描述】:

我有一个 django 项目,我正在使用 Django Rest Frameowkr。我为用户模型设置了模型、序列化程序、视图和 url。我有网址文件。我想在调用 api url 时传入类似用户名的东西。我目前已将其设置为具有主键,因此当我输入主键时它可以工作。我想将其切换为用户名。我还希望序列化程序查询返回带有我传入的用户名的用户对象。 我正在使用来自 django.contrib.auth.models 的 Django 标准 User 对象 这是我的代码

网址.py

from django.urls import path
from django.contrib.auth.models import User

from .views import UserListView, UserDetailsView
from .views import ProfileListView, ProfileDetailsView
from .views import RoleListView, RoleDetailsView

urlpatterns = [
    path('user/', UserListView.as_view()),
    path('user/<pk>', UserDetailsView.as_view()),
]

serializer.py 文件

from rest_framework import serializers

from django.contrib.auth.models import User
from users.models import Profile, Role

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'is_staff', 'last_login')

Views.py 文件

from rest_framework.generics import ListAPIView, RetrieveAPIView

from django.contrib.auth.models import User

from users.models import Profile, Role
from .serializers import UserSerializer, ProfileSerializer, RoleSerializer

class UserListView(ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetailsView(RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

【问题讨论】:

【参考方案1】:

UserDetailsView 中指定lookup_field,并在urls.py 中更改网址格式,如下所示

# urls.py
urlpatterns = [
    path('user/', UserListView.as_view()),
    path('user/<username>', UserDetailsView.as_view()),
]


# views.py
class UserDetailsView(RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'username'

【讨论】:

它有效,但我还有另一个问题。假设我想做同样的事情,但在另一个表的外键用户中找到用户名。用户是另一个模型的外键。我不想从 url 中获取该用户名并在该外键中进行查找。 @JPG 不推荐nested lookup,因为需要时间(在后台,Django加入相关表) 如果你想做,currentfield__username in lookup_field 所以如果我有这个......它应该可以工作。 class ProfileDetailsView(RetrieveAPIView): queryset = Profile.objects.all() serializer_class = ProfileSerializer lookup_field = 'user__username' 或者我应该在没有用户名的引号的情况下这样做。有一个名为 Profile 的表有一个用户 foriegnkey

以上是关于尝试传递一个字符串以通过 Django Rest Framework url 进行查询的主要内容,如果未能解决你的问题,请参考以下文章

在通过序列化器 django rest 框架时传递额外的数据

Python Dict 中出现的特殊字符从 AWS 构建并通过 django 视图传递给 js

我应该通过 HTTP 标头或将正文作为 JSON 传递到 REST Api 吗?

从 Django Rest Framework 将经过身份验证的用户传递给 SendBird

django rest框架:在视图中获取url路径变量

Django REST Framework 更新外键