如何使用 django Rest 框架保存多对多字段对象

2024-05-12

我有博客、发布、标签三个模型。在博客模型中,我将字段“postedin”作为发布模型的外键,将“标签”作为标签模型的许多字段。

模型.py:

class Posted(models.Model):
    name = models.CharField(_('Posted In'),max_length=255, unique=True)

class Tags(models.Model):
    name = models.CharField(_('Tag Name'),max_length=255, unique=True)

class Blogs(models.Model):
    author = models.ForeignKey(CustomUser)
    title=models.CharField(max_length=100)
    postedin=models.ForeignKey(Posted)
    tags= models.ManyToManyField(Tags)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

视图.py:

class BlogViewSet(viewsets.ModelViewSet):
    queryset=Blogs.objects.order_by('-created_at')
    serializer_class= BlogsSerializer

def get_permissions(self):
    if self.request.method in permissions.SAFE_METHODS:
        return (permissions.AllowAny(),)
    return (permissions.IsAuthenticated(),IsAuthorOfBlog())

def perform_create(self,serializer):

    serializer.save(author=self.request.user)

    return super(BlogViewSet,self).perform_create(serializer)

序列化器.py:

class TagsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tags

        fields = ('pk','name')
        read_only_fields=('pk','name')

class PostedSerializer(serializers.ModelSerializer):
    class Meta:
        model = Posted

        fields = ('pk','name')
        read_only_fields=('pk','name')

class BlogsSerializer(serializers.ModelSerializer):
    author = AccountSerializer(read_only=True,required=False)
    tags=TagsSerializer(read_only=True,many=True)
    tags_id = serializers.PrimaryKeyRelatedField(queryset=Tags.objects.all(), write_only=True)
    postedin = PostedSerializer(read_only=True)
    postedin_id = serializers.PrimaryKeyRelatedField(queryset=Posted.objects.all(), write_only=True)

    class Meta:
        model = Blogs

        fields = ('pk','author','title','tags','tags_id','postedin','postedin_id','content','created_at','updated_at')
        read_only_fields=('pk','created_at','updated_at')


    def get_validation_exclusions(self, *args, **kwargs):
        exclusions = super(BlogsSerializer, self).get_validation_exclusions()

        return exclusions + ['author']
    def create(self, validated_data):
        postedin = validated_data.pop('postedin_id')
        tags = validated_data.pop('tags_id')
        blogs = Blogs.objects.create(tags=tags,postedin=postedin, **validated_data)
        return blogs

请求已发送:

{标题:“nvnbv”,postedin_id:“1”,tags_id:[“2”,“5”,“1”,“4”],内容:“nmvmvjm”}

收到回复:

{tags_id: ["类型不正确。预期 pk 值,已收到列表。"]}

我是 Django-rest-framework 的初学者。如何解决此错误。

提前致谢 !


感谢@Abdulafaja 的建议。

最后我得到了解决方案

博客序列化器应该是

class BlogsSerializer(serializers.ModelSerializer):
    author = AccountSerializer(read_only=True,required=False)
    tags=TagsSerializer(read_only=True,many=True)
    tags_id = serializers.PrimaryKeyRelatedField(queryset=Tags.objects.all(), write_only=True,many=True)
    postedin = PostedSerializer(read_only=True)
    postedin_id = serializers.PrimaryKeyRelatedField(queryset=Posted.objects.all(), write_only=True)

    class Meta:
        model = Blogs

        fields = ('pk','author','title','tags','tags_id','postedin','postedin_id','content','created_at','updated_at')
        read_only_fields=('pk','created_at','updated_at')


    def get_validation_exclusions(self, *args, **kwargs):
        exclusions = super(BlogsSerializer, self).get_validation_exclusions()

        return exclusions + ['author']
    def create(self, validated_data):
        postedin = validated_data.pop('postedin_id')
        tags = validated_data.pop('tags_id')
        blogs = Blogs.objects.create(postedin=postedin, **validated_data)
        for tg in tags:
            blogs.tags.add(tg)
        return blogs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 django Rest 框架保存多对多字段对象 的相关文章

随机推荐

  • 如何等待,直到我从 Angular 7 中的后端 Spring Boot API 得到响应

    我想使用 http post 方法的结果从一条路线导航到另一条路线 但导航是在没有 http post 响应的情况下发生的 当我调试代码时 响应越来越晚 我怎样才能解决这个问题 有什么办法可以等待执行直到后端返回响应吗 当我单击按钮时 将执
  • 使用 firebase 按最新消息对聊天列表进行排序

    我不知道为什么我陷入了一个问题chatList不按最后一条消息时间或最新消息排序 我尝试过存储timestamp在数据库中和订单子依据时间戳 但它仍然不起作用 不起作用意味着列表不会在每条消息后排序 并继续将列表显示为在第一条消息后排序 看
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • 更新查询增量字段加上 1 codeigniter 函数 [重复]

    这个问题在这里已经有答案了 我想在 codeigniter 项目中将字段值增加到当前值加 1 所以 我做了一个功能 但它不起作用 我的职能是 function increse field by 1 table name fieldToInc
  • 如何使用自定义布局跳转到 UICollectionView 中的任何 Cell?

    我的水平 UICollectionView 中有 40 个单元格和一个按钮 当我点击按钮时 我可以从 5 号单元格跳转到 10 号单元格 但是一旦我想要转到另一个单元格 例如从 5 到 25 它不起作用 而是变为 0 code func s
  • 猪参考

    我正在学习 Hadoop Pig 并且我总是坚持引用元素 请查找下面的示例 groupwordcount group chararray words bag of tokenTuples from line token chararray
  • 隐式方法组转换陷阱

    我想知道为什么给定代码的输出 在 LinqPad 中执行 void Main Compare1 Action Main Dump Compare2 Main Dump bool Compare1 Delegate x return x Ac
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • 如何在 couchdb 视图中调用另一个视图?

    我刚刚读完 couchdb 权威指南 一书 并开始摆弄设计文档 然而有一件事我不明白 到目前为止我看到的所有例子都有些线性 Example id 1 rev name first something blue child 2 id 2 re
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 在 sed 命令和范围地址中使用不同的分隔符

    我在 shell 脚本中使用 sed 来编辑文件系统路径名 假设我想替换 foo bar with baz qux 然而 sed 的s 命令使用正斜杠 作为分隔符 如果我这样做 我会看到发出一条错误消息 例如 sed s foo bar b
  • Android LayerDrawable.setDrawableByLayerId 不适用于 HTC Sensation(和其他?)

    我正在使用 LayerDrawable 在底层图像 索引 0 上构建一系列热点 索引 1 热点是根据用户界面交互添加的 并且它们的位置是动态的 因此我以编程方式完成所有这些操作 而不是使用 XML 作为进一步 可能不相关 的细节 我使用 F
  • linkedin js 如何是有效的 javascript

    LinkedIn Javascript 集成是通过以下方式完成的 我不明白 这怎么是一个有效的javascript 为什么 api key 没有被引用 脚本标签的主体带有src永远不会被执行 但是 加载的脚本可以像访问任何其他元素的内容一样
  • 从流程图中获取数据系列的颜色

    在看到 stackoverflow 用户页面上很酷的新 声誉 选项卡后 我受到启发 开始尝试使用 Flot 图表库 我有一个包含数百个系列的折线图 在任何给定时间 这些系列中只有几个是可见的 我的数据系列分为几个 类别 我根据该类别分配数字
  • 迁移大型 Core Data 数据库崩溃

    我有一个将产品存储在核心数据文件中的应用程序 这些产品包括作为 可转换 数据的图像 现在我尝试使用轻量级迁移添加一些属性 当我使用一个小型数据库对其进行测试时 它运行良好 但当我使用一个接近 500 MB 的大型数据库时 应用程序通常会因内
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • Kerberos 缓存票证

    我使用的是 Windows 7 64 位 我创建了一个简单的应用程序来对实现 PrivilegedAction 的类的 run 方法中的文件进行计数 以下是我的 jaas conf 文件 CountFiles com sun securit
  • 如何使用 django Rest 框架保存多对多字段对象

    我有博客 发布 标签三个模型 在博客模型中 我将字段 postedin 作为发布模型的外键 将 标签 作为标签模型的许多字段 模型 py class Posted models Model name models CharField Pos