首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何更改HyperLinkedModelSerializer的默认<pk> lookup_url_kwarg?

如何更改HyperLinkedModelSerializer的默认<pk> lookup_url_kwarg?
EN

Stack Overflow用户
提问于 2021-02-03 11:37:41
回答 2查看 571关注 0票数 0

我想使用HyperLinkedModelSerializer来为我的Book模型添加一个url字段。以下是您通常在普通教程中找到的解决方案:

代码语言:javascript
运行
AI代码解释
复制
# serializers.py
class BookSerializer(HyperLinkedModelSerializer):
    class Meta:
        model = Book
        fields = ("title", "url",)

# views.py
class BookView(RetrieveAPIView):
    serializer_class = BookSerializer

# urls.py
urlpatterns = [
    path("<pk>/", BookDetailView.as_view(), name="book-detail"),
]

这也没问题。但是现在我需要更改URL以匹配图书id,不是用<pk>,而是用<fiction_id>。所以我想我应该把它改了!

代码语言:javascript
运行
AI代码解释
复制
# urls.py
urlpatterns = [
    path("<fiction_id>/", BookDetailView.as_view(), name="book-detail"),
]

现在飞机坠毁了:

代码语言:javascript
运行
AI代码解释
复制
django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "fiction-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

在我看来,我尝试过摆弄lookup_fieldlookup_url_kwargs

代码语言:javascript
运行
AI代码解释
复制
# views.py
class BookView(RetrieveAPIView):
    serializer_class = BookSerializer
    lookup_field = "pk"
    lookup_url_kwargs = "fiction_id"

我试过提醒序列化程序实际查找(默认) "pk":

代码语言:javascript
运行
AI代码解释
复制
# serializers.py
class BookSerializer(HyperLinkedModelSerializer):
    class Meta:
        model = Book
        fields = ("title", "url",)
        extra_kwargs = {
            "url": {"lookup_field": "pk"},
        }

我试过这些组合,但没有用。看起来,如果你想利用<pk>的url字段,除了HyperLinkedModelSerializer之外,什么都不能用。文档似乎没有提供一种改变这种行为的方法:

默认情况下,超链接应该对应与样式“{model_name}-detail”匹配的视图名称,而则通过pk关键字参数查找实例。

我怎样才能改变这种行为,或者它一定会变得太混乱?

EN

回答 2

Stack Overflow用户

发布于 2021-02-03 23:54:08

您应该检查HyperlinkedModelSerializer实现,并确保它使用serializer_related_field默认值为HyperlinkedRelatedField

代码语言:javascript
运行
AI代码解释
复制
class HyperlinkedModelSerializer(ModelSerializer):
    """
    A type of `ModelSerializer` that uses hyperlinked relationships instead
    of primary key relationships. Specifically:

    * A 'url' field is included instead of the 'id' field.
    * Relationships to other instances are hyperlinks, instead of primary keys.
    """
    serializer_related_field = HyperlinkedRelatedField
    ...

然后HyperlinkedRelatedField有一个类属性lookup_field默认为pk

代码语言:javascript
运行
AI代码解释
复制
class HyperlinkedRelatedField(RelatedField):
    lookup_field = 'pk'
    ...

您可以做的是在您自己的HyperlinkedRelatedField中使用自定义lookup_field

代码语言:javascript
运行
AI代码解释
复制
from rest_framework.relations import HyperlinkedRelatedField
from rest_framework.serializers import HyperlinkedModelSerializer


class BookHyperlinkedRelatedField(HyperlinkedRelatedField):
    lookup_field = 'fiction_id'


class BookSerializer(HyperLinkedModelSerializer):
    serializer_related_field = BookHyperlinkedRelatedField
    
    class Meta:
        model = Book
        fields = ("title", "url",)
票数 1
EN

Stack Overflow用户

发布于 2021-02-04 08:02:59

为此,需要通过extra_kwargs字典传递url字段在匹配模式中查找的新名称:

代码语言:javascript
运行
AI代码解释
复制
# serializers.py
class BookSerializer(HyperLinkedModelSerializer):
    class Meta:
        model = Book
        fields = ("title", "url",)
        extra_kwargs = {
            "url": {"lookup_url_kwarg": "fiction_id"},
        }

还记得修改相应的视图:

代码语言:javascript
运行
AI代码解释
复制
# views.py
class BookView(RetrieveAPIView):
    serializer_class = BookSerializer
    lookup_url_kwarg = "fiction_id"

不要用复数形式写lookup_url_kwargs。只要在模型的主键上进行查找,就不需要在任何级别上干预lookup_field

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66034534

复制
相关文章
实验1 OpenGL初识
常用的程序设计语言,如C、C++、Pascal、Fortran和Java等,都支持OpenGL的开发。这里只讨论C版本下OpenGL的语法。 OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式。如glColor3b(…)、glColor3d(…)、glColor3f(…)和glColor3bv(…)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。 为便于移植,OpenGL定义了一些自己的数据类型,如GLfloat、GLvoid,它们其实就是C语言中的float和void。在gl.h文件中可以看到以下定义:
步行者08
2020/05/21
1K0
实验1 OpenGL初识
Windows下的OpenGL编程步骤简单介绍详见课程实验教学博客-实验准备安装GLUT包与创建工程:
步行者08
2018/10/09
7560
shell编程/字库裁剪(1)——想法
  我写这个帖子的意图,在于三个:   1.用代码生成代码的思维。   2.shell编程的思路。   3.裁剪字库的具体程序。   我打算分为三节来说:   第一节讲裁剪词库的意义以及使用场合;   第二节讲如何用shell来解决这个问题;   第三节讲如何测试结果。   很多带有点阵液晶的硬件项目可能需要显示汉字、ASCII字符,有的廉价的液晶里没有字库,有的液晶里带有了字库但可能需要其他字体的支持。这种时候我们就需要使用外置的字库了。一般一个字库需要几百K大小,当然对于有外置flash的情况下根本不算
窗户
2018/02/07
7960
opengl入门-坐标系统(1)
坐标系变换流程 变换的好处: 1.1 方便计算 1.2 把很复杂的逻辑拆解成一次次独立的简单变换
公号sumsmile
2020/06/10
1.2K0
17.opengl高级-帧缓冲(1)
1.3. check帧缓冲状态(没有深入理解,具体需要检测哪些数据),后面的操作渲染到当前帧缓冲中,即离屏渲染(Off-screen Rendering),窗口上看不到任何变化
公号sumsmile
2020/07/10
1.9K0
17.opengl高级-帧缓冲(1)
利用其它widthStep方法把interest_img的所有像素值增加1[通俗易懂]
#include “stdafx.h” #include <cv.h> #include <highgui.h>
全栈程序员站长
2022/08/23
3130
OpenGL 从入门到成魔-第1章- OpenGL 环境的搭建
注:参考自bilibili系列视频,OpenGL 从入门到成魔-第1章- OpenGL 环境的搭建https://www.bilibili.com/video/BV1qa4y1e7zP
瑶瑶
2020/06/03
1.5K0
OPengL ES _ 着色器_实战1
1.由于着色器编译 链接过程较为繁琐,我封装了一下,文件名为"OSShaderManager.h" 和"OSShaderManager.m" 如果你对着色器程序加载过程不熟悉请参考OpenGL ES _ 着色器 _ 程序 代码:
酷走天涯
2018/09/14
5400
OPengL ES _ 着色器_实战1
返回指针值的函数(1)
/**有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后, **/ #include <stdio.h> #include <stdlib.h> int main() { float *aa(int (*p)[4],int n); float a[3][4]={{50,99,80,50},{55,60,85,90},{10,54,74,26}}; float *pt; int k; scanf("%d",&k); pt=aa(a,k);
谙忆
2021/01/19
2.4K0
iOS开发-OpenGL ES入门教程1
前言 这里是一篇新手教程,环境是Xcode7+OpenGL ES 2.0,目标写一个OpenGL ES的hello world。 OpenGL ES系列教程在这里。 OpenGL ES系列教程的代
落影
2018/04/27
1.4K0
iOS开发-OpenGL ES入门教程1
1、关闭所有Check Sum Offload
我在我的win11上启用了Hyper-v,装了个虚拟机跑了个CentOS7.6,为了让centos和宿主机通信在同个网段搞了个桥接网络,网络环境如下
乔达摩@嘿
2022/05/10
2.2K0
1、关闭所有Check Sum Offload
《手撕链表题系列-1》删除链表中等于给定值 val 的所有节点
前言 本系列主要讲解链表的经典题 注:划重点!!必考~ 删除链表中等于给定值 val 的所有节点 力扣链接:203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 示例: 提示: 列表中的节点数目在范围 [0, 104] 内 1 <= Node.val <= 50 0 <= val <= 50 解题思路: 这里我们选择使用尾插法,遍历链表把不是val的节点给尾插到一个新的链表上
用户9645905
2022/11/30
3590
《手撕链表题系列-1》删除链表中等于给定值 val 的所有节点
f1 score是什么_F1值
调和平均数:Hn=n/(1/a1+1/a2+…+1/an) 几何平均数:Gn=(a1a2…an)^(1/n) 算术平均数:An=(a1+a2+…+an)/n 平方平均数:Qn=√ [(a1^2+a2^2+…+an^2)/n] 这四种平均数满足 Hn ≤ Gn ≤ An ≤ Qn
全栈程序员站长
2022/11/04
9510
java integer最大值_java int型最大值/最小值,最大值+1,最小值-1
java中,int型变量是有符号整形变量。int型变量占用4个字节(32bit位)。
全栈程序员站长
2022/10/04
2K0
5.opengl-变量修饰符
它并没有类型in、out或是uniform的声明,而是直接使用,且在后面的程序中也未被引用。原来它是默认是归一化的裁剪空间坐标,xyz各个维度的范围为-1到1,仅能在顶点着色器中使用,既是输入也是输出。gl_Position赋值范围就是float的取值范围(32位),只不过只有[-1,1]区间的片元被绘制。它是vec4类型的,不能重声明为dvec4等类型。
诺谦
2020/11/04
6560
Python+OpenGL实现Liang-Barsky算法裁剪直线
Liang-Barsky参数化裁剪算法是计算机图形学领域一个经典算法,用来对二维直线进行快速裁剪,使得仅需要绘制直线段落在裁剪窗口中的部分,不显示裁剪窗口之外的内容。
Python小屋屋主
2022/04/13
7800
Python+OpenGL实现Liang-Barsky算法裁剪直线
SHA-1被破解始末
大概是前天吧,朋友圈普天盖地地被sha1破解刷屏了。做这事的人是google,酷酷的google,喜欢酷酷的发一篇论文,然后一大堆人跟屁虫似的开始了实现之旅;喜欢酷酷的破解后,发一个报告,然后一众人又对谷歌顶礼膜拜。顶礼膜拜之余,人们不免心生怯意,这尼玛世上还有不被破解的加密算法吗?怎么感觉没有啊,都是玩得文字游戏啊。 也许有的朋友还并不是非常了解sha是个什么东东,直到它被破解的那一日。 让我们从maven repository目录下的文件说起吧: 相信你对这样的目录相当熟悉,发现没?这里边就有s
ImportSource
2018/04/03
6.3K0
SHA-1被破解始末
SQL---NULL值处理(1)
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
IT云清
2019/01/16
7420
[Go] GODEBUG=inittrace=1 查看所有执行的init函数
在go语言中查看所有执行的init函数 , 可以使用这个环境变量 linux下可以直接执行 GODEBUG=inittrace=1 具体命令 winddows下 set GODEBUG=inittra
唯一Chat
2021/04/27
1.1K0
[Go] GODEBUG=inittrace=1 查看所有执行的init函数
点击加载更多

相似问题

OpenGL ES 1裁剪对象

13

SAS:将除1之外的所有值求和

40

OpenGL:计算1:1像素比例的z值

40

UITableView右边被裁剪了1个像素

10

在只包含1和0的数组中查找前1的索引,0都在数组的左侧,而所有的1都在右侧?

322
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文