无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL

     2023-02-24     111

关键词:

【中文标题】无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL【英文标题】:Could not resolve URL for hyperlinked relationship using view name ( django-rest-framework ) 【发布时间】:2018-06-29 19:50:26 【问题描述】:

问题:

我收到这样的错误。

在 /api/users/ 处配置不正确

无法使用视图名称解析超链接关系的 URL “用户详细信息”。您可能未能将相关模型包含在 您的 API,或者错误地配置了 lookup_field 属性 这个字段。

我读过这个post,但它没有用。

serializers.py

​​>
class UserSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='user-detail',
                                               lookup_field='profile')

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'url')


class UserProfileSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')

    class Meta:
        model = UserProfile
        fields = "__all__"
        # user = serializers.ReadOnlyField(source='owner.username')

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass

urls.py

​​>
user_profile_list = UserProfileViewSet.as_view(
    'get': 'list',
    'post': 'create'
)
user_profile_detail = UserProfileViewSet.as_view(
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy'
)
user_list = UserViewSet.as_view(
    'get': 'list'
)
user_detail = UserViewSet.as_view(
    'get': 'retrieve'
)
user_profiles_detail = UserViewSet.as_view(
    'get': 'profile'
)

router = DefaultRouter()
router.register(r'userprofiles', views.UserProfileViewSet)
router.register(r'users', views.UserViewSet)

urlpatterns = [
    url(r'^', include(router.urls))
]

views.py

​​>
class UserProfileViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.
    """
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)
    pagination_class = LimitTenPagination

    @detail_route(renderer_classes=[renderers.JSONRenderer])
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)


class UserViewSet(viewsets.ReadOnlyModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer

来自我的 models.py 的片段

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')

我尝试了什么:

我尝试将user-detail 更改为api:user-detail(是的api 命名空间确实存在于主urls.py 文件中)

【问题讨论】:

我知道您希望在User 序列化程序中有一个字段指向其配置文件的 URL,对吗? 您是想让 url 指向用户详细信息视图还是用户个人资料详细信息视图? @JessamynSmith 我正试图将其提供给用户详细信息,这就是为什么我选择model 作为User 而不是UserProfile @dukebody 是的,就是这样 【参考方案1】:

    看文档,我相信你必须使用HyperLinkedRelatedField。另请参阅this related SO post。

    您在序列化器字段定义中混淆了参数。我认为应该是:

    class UserSerializer(serializers.ModelSerializer):
        url = serializers.HyperlinkedRelatedField(view_name='api:userprofile-detail',
                                                  source='profile')
    

编辑:

添加namespaceapi

【讨论】:

我发现这只有在我将字段命名为与模型中相同时才有效,例如:profile = serializers.HyperlinkedRelatedField(read_only=True, view_name='userprofiles-detail') @JessamynSmith 是的,这就是为什么需要添加命名空间【参考方案2】:

从您的HyperlinkedIdentityField 中删除lookup_filed 属性,因为您不需要它。

因此您的 serializer 类应该如下所示:

class UserSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='user-detail', source='profile',)

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'url')

属性lookup_filed仅在引用使用relationship-field/attribute作为主键而不是默认autoincrement的模型类时才需要。例如,如果您的模型类如下所示,则可以使用它:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile', primary_key=True)

【讨论】:

【参考方案3】:

如果您正在扩展 GenericViewSet 和 ListModelMixin 类,并且在列表视图中添加 url 字段时遇到相同的错误,那是因为您没有定义详细视图。确保您正在扩展 RetrieveModelMixin mixin:

class UserViewSet (mixins.ListModelMixin,
                   mixins.RetrieveModelMixin,
                   viewsets.GenericViewSet):

感谢 Rowinson Gallego 的回答

【讨论】:

无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL

】无法使用视图名称(django-rest-framework)解析超链接关系的URL【英文标题】:CouldnotresolveURLforhyperlinkedrelationshipusingviewname(django-rest-framework)【发布时间】:2018-06-2919:50:26【问题描述】:问题:我收到这样的错误。在/api/users/处配置不... 查看详情

django.core.exceptions.ImproperlyConfigured:无法使用视图名称“用户详细信息”解析超链接关系的 URL

】django.core.exceptions.ImproperlyConfigured:无法使用视图名称“用户详细信息”解析超链接关系的URL【英文标题】:django.core.exceptions.ImproperlyConfigured:CouldnotresolveURLforhyperlinkedrelationshipusingviewname"user-detail"【发布时间】:2017-02-25 查看详情

无法在 Spring Boot 中解析名称为“index”的视图

】无法在SpringBoot中解析名称为“index”的视图【英文标题】:Couldnotresolveviewwithname\'index\'inSpringBoot【发布时间】:2020-12-1102:53:18【问题描述】:春季启动:2.3.3.RELEASEJava:11我使用webflux+RouterFunction+Thymeleaf并遇到错误“无法解析名... 查看详情

无法导入名称视图

】无法导入名称视图【英文标题】:Cannotimportnameviews【发布时间】:2014-11-1515:10:53【问题描述】:ImportErrorat/cannotimportnameviewsRequestMethod:GETRequestURL:http://127.0.0.1:8000/DjangoVersion:1.7ExceptionType:ImportErrorExceptionValue:cannotimp 查看详情

圣杯。无法解析名称为“grailsDispatcherServlet”的 servlet 中名称为“index”的视图

】圣杯。无法解析名称为“grailsDispatcherServlet”的servlet中名称为“index”的视图【英文标题】:Grails.Couldnotresolveviewwithname\'index\'inservletwithname\'grailsDispatcherServlet\'【发布时间】:2015-08-0610:08:09【问题描述】:我开始使用Grails(3.x)... 查看详情

Django 无法导入名称视图

】Django无法导入名称视图【英文标题】:DjangoCannotimportnameviews【发布时间】:2013-10-0320:04:56【问题描述】:所以我试图通过在DjangoProject上做“第一个Django应用程序”的事情来加快Django的副项目,但是当我第一次尝试设置视图时... 查看详情

无法在视图中显示名称列表

】无法在视图中显示名称列表【英文标题】:Cannotdisplaythelistofnamesintotheview【发布时间】:2018-09-1917:47:59【问题描述】:我有一个在ViewModel中准备的列表,用于从数据库表中获取值。分配给模型类的列表:publicclassDTypepublicstringDTN... 查看详情

无法在情节提要的容器视图中添加 textview 名称

】无法在情节提要的容器视图中添加textview名称【英文标题】:Can\'taddtextviewnameinsideacontainerviewinstoryboard【发布时间】:2018-01-0709:41:15【问题描述】:我在视图上添加了一个容器视图,并在其中添加了一个文本视图。该应用程序... 查看详情

无法使用函数从一个视图访问另一个视图的变量?

】无法使用函数从一个视图访问另一个视图的变量?【英文标题】:Unabletoaccessavariablefromoneviewtoanotherviewusingfunctions?【发布时间】:2016-05-1315:51:45【问题描述】:我在Django中编写了一个注册表单。我正在尝试将成功注册的用户的... 查看详情

从 url 中删除 joomla 视图名称和组件名称

...?我在router.php文件中的BuildRoute方法中使用此代码,但我无法删除视图名称:if(isset($query[\'view\']))$segments[]=$query[ 查看详情

无法将数组名称传递到 Swift 3 中的表视图中

】无法将数组名称传递到Swift3中的表视图中【英文标题】:NotabletopassarraynameintotableviewinSwift3【发布时间】:2016-12-2906:29:09【问题描述】:我对swift代码比较陌生。无法将plist中的数组文本传递到表格视图中...现在我在模拟器中得... 查看详情

javax.servlet.ServletException:无法在名称为“NA-dispatcher”的 servlet 中解析名称为“login”的视图

】javax.servlet.ServletException:无法在名称为“NA-dispatcher”的servlet中解析名称为“login”的视图【英文标题】:javax.servlet.ServletException:Couldnotresolveviewwithname\'login\'inservletwithname\'NA-dispatcher\'【发布时间】:2019-07-1608:40:46【问题描述】... 查看详情

HTML 模板确实存在(base.html),Pycharm 解释器无法从我的应用名称 = 'app' 导入视图

】HTML模板确实存在(base.html),Pycharm解释器无法从我的应用名称=\\\'app\\\'导入视图【英文标题】:HTMLtemplatedoesonexist(base.html),Pycharminterpreterisunabletoimportviewsfrommyappname=\'app\'HTML模板确实存在(base.html),Pycharm解释器无法从我的应... 查看详情

表视图单元格 - UITableView - 无法在详细视图中显示多行

】表视图单元格-UITableView-无法在详细视图中显示多行【英文标题】:TableViewCell-UITableView-Cannotshowmultiplerowsindetailedview【发布时间】:2015-09-0509:21:59【问题描述】:我正在使用Tableview来显示来自recipesArray的Name,效果很好,并在来... 查看详情

Grails 3 + Tomcat 8:无法解析名称为“grailsDispatcherServlet”的 servlet 中名称为“/login/authAjax”的视图

】Grails3+Tomcat8:无法解析名称为“grailsDispatcherServlet”的servlet中名称为“/login/authAjax”的视图【英文标题】:Grails3+Tomcat8:Couldnotresolveviewwithname\'/login/authAjax\'inservletwithname\'grailsDispatcherServlet\'【发布时间】:2016-08-2010:09:05【 查看详情

未指定 base_name 参数,并且无法从视图集中自动确定名称,因为它没有 .queryset 属性

】未指定base_name参数,并且无法从视图集中自动确定名称,因为它没有.queryset属性【英文标题】:base_nameargumentnotspecified,andcouldnotautomaticallydeterminethenamefromtheviewset,asitdoesnothavea.querysetattribute【发布时间】:2018-07-1022:39:40【问题描... 查看详情

使用通用登录视图时出现“名称'django'未定义”错误?

】使用通用登录视图时出现“名称\\\'django\\\'未定义”错误?【英文标题】:"name\'django\'notdefined"errorwhenusingthegenericloginview?使用通用登录视图时出现“名称\'django\'未定义”错误?【发布时间】:2014-01-3100:20:04【问题描述... 查看详情

Java、Spring、Apache Tiles 错误:无法解析名称为“dispatcher”的 servlet 中名称为“index”的视图

】Java、Spring、ApacheTiles错误:无法解析名称为“dispatcher”的servlet中名称为“index”的视图【英文标题】:Java,Spring,ApacheTileserror:Couldnotresolveviewwithname\'index\'inservletwithname\'dispatcher\'【发布时间】:2014-05-0316:36:06【问题描述】:我... 查看详情