Django - 在外键对象确实存在的情况下设置 ManyToMany 属性时,序列化程序抛出“无效的 pk - 对象不存在”

2024-01-08

所以下面我有一些代码来测试某人创建帖子并且该帖子有一个功能hash_tag在本例中是“#video”。该代码采用Post body并使用正则表达式查找以“#”开头的任何单词。如果是,那么它会创建或获取HashTag来自HashTag桌子。然后设置该列表HashTag to the hash_tags下的属性Post.

由于某种原因CreatePostSerializer序列化程序抛出一个没有意义的异常。序列化器抛出异常ValidationError({'hash_tags': [ErrorDetail(string='Invalid pk "[\'video\']" - object does not exist.', code='does_not_exist')]})。这没有意义的原因是因为当我调试并在之后立即设置断点时except Exception as e under views.py这就是我得到的

>>>e
ValidationError({'hash_tags': [ErrorDetail(string='Invalid pk "[\'video\']" - object does not exist.', code='does_not_exist')]})
>>>HashTag.objects.get(pk='video')
<HashTag: HashTag object (video)>
>>>request.data['hash_tags']
['video']

So the >>>代表我输入到调试器中的内容。我基本上停在队伍里了return Response...我们可以看到e is the ValidationError我提到过,但是我们可以看到它声称不存在的对象确实存在。为什么序列化程序会抛出“ValidationError - 对象不存在”?

Note:我有另一个测试,它执行完全相同的操作并通过,但没有传递视频文件,这让我相信 Django 在传入正文的情况下正在做一些不同的事情multi-part。我还尝试过只设置一个哈希标签的情况hash_tags=而不是列表并且它有效。但这是一种黑客攻击,更清洁的解决方案是首选。

助手.py

import re

def extract_hashtags(text):
    regex = "#(\w+)"
    return re.findall(regex, text)

test.py

def test_real_image_upload_w_hash_tag(self):
    image_file = retrieve_test_image_upload_file()
    hash_tag = 'video'
    response = self.client.post(reverse('post'),
                                data={'body': f'Some text and an image #{hash_tag}',
                                      'images': [image_file]},
                                **{'HTTP_AUTHORIZATION': f'bearer {self.access_token}'})
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

views.py

def set_request_data_for_post(request, user_uuid: str):
    request.data['creator'] = user_uuid
    post_text = request.data['body']
    hash_tags_list = extract_hashtags(post_text)
    hash_tags = [HashTag.objects.get_or_create(hash_tag=ht)[0].hash_tag for ht in hash_tags_list]

    if len(hash_tags) > 0:
        request.data['hash_tags'] = hash_tags

    return request

def create_post(request):
    user_uuid = str(request.user.uuid)
    request = set_request_data_for_post(request=request, user_uuid=user_uuid)

    try:
        serializer = CreatePostSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            post_obj = serializer.save()
    except Exception as e:
        return Response(dict(error=str(e),
                             user_message=error_message_generic),
                        status=status.HTTP_400_BAD_REQUEST)

    return Response(serializer.data, status=status.HTTP_201_CREATED)

序列化器.py

from rest_framework import serializers
from cheers.models import Post

class CreatePostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('creator', 'body', 'uuid', 'created', 'updated_at', 'hash_tags')

model.py

class Post(models.Model):
    # ulid does ordered uuid creation
    uuid = models.UUIDField(primary_key=True, default=generate_ulid_as_uuid, editable=False)
    created = models.DateTimeField('Created at', auto_now_add=True)
    updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
    creator = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator")
    body = models.CharField(max_length=POST_MAX_LEN, validators=[MinLengthValidator(POST_MIN_LEN)])
    hash_tags = models.ManyToManyField(HashTag, blank=True)

class HashTag(models.Model):
    hash_tag = models.CharField(max_length=HASH_TAG_MAX_LEN, primary_key=True, validators=[
        MinLengthValidator(HASH_TAG_MIN_LEN)])

在你的test/__init__.py你必须添加这些行

from django.db.backends.postgresql.features import DatabaseFeatures

DatabaseFeatures.can_defer_constraint_checks = False

有一些奇怪的内部错误,如果你在一张表上操作很多不同的表TestCase类,然后它会在被拆除后最后进行数据库检查,并且会导致错误。

我也在使用工厂男孩(https://factoryboy.readthedocs.io/en/stable/orms.html https://factoryboy.readthedocs.io/en/stable/orms.html)来生成我的测试数据库,这是出现此问题的主要原因。我相信这是因为我把工厂男孩换成只使用<model>.objects.create()我的测试不再失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 在外键对象确实存在的情况下设置 ManyToMany 属性时,序列化程序抛出“无效的 pk - 对象不存在” 的相关文章

  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • iTextSharp - XFA 填充日期/时间字段

    工作流程是这样的 我们下载一个模板表单 预填充静态值 导出 XML 模板 使用 NET 表单应用程序解析 XML 添加动态值 生成的 XML 需要重新导入到 PDF 模板中 在 iTextSharp 上使用 MergeXfaData 方法一
  • xlwings - 删除一系列行

    我似乎找不到一种方法来删除从第 x 行开始到工作表底部的一系列行 例如在VBA代码中我会这样做 Rows CStr currRow 65536 Select Selection Delete Shift xlUp 其中 currRow 可以
  • 降低 Vuetify 下拉菜单的高度

    我无法降低 Vuetify 下拉组件的高度v select 我尝试使用道具dense但它只会降低要选择的选项的高度 并且不会对关闭的下拉列表产生任何影响 我尝试了以下模板代码
  • Android O:通知通道本地化

    我创建了一个这样的通知通道 NotificationChannel channel new NotificationChannel CHANNEL ID FOOBAR getContext getString R string notifi
  • 利用 BackGroundWorker 在 Winforms 控件上跨线程调用 GUI 操作?

    受到我自己使用多线程 Winforms 应用程序的经验以及诸如此类的问题的启发 避免跨线程 WinForm 事件处理中 Invoke BeginInvoke 的麻烦 https stackoverflow com questions 136
  • 如何使用鼠标拖动来画线?

    我需要使用光标在delphi中画一条线 我已经创建了线代码 但我不知道下一步该做什么 如何才能做到这一点 我按下鼠标 当线条需要开始并拖动鼠标时 或者简单地释放鼠标按钮并绘制线条 procedure TForm1 Button1Click
  • 如何查明在我的 servlet 中按下了哪个 HTML 按钮?

    我正在创建一个包含两个提交按钮的注册表单 我需要知道在我的 servlet 代码中单击了表单中的哪个按钮 阅读以下问题的答案这个问题 https stackoverflow com questions 5222 accessing post
  • 获取有关 LLDB 中错误内存地址的信息

    我正在尝试在我的 iPhone 应用程序中调试 EXC BAD ACCESS 它在方法调用时崩溃 并且该方法的行是EXC BAD ACCESS code 1 address xxx 以前 我只会使用gdb info malloc histo
  • 一堂课可以延长两堂课吗?

    我的班级应该同时扩展两个班级 public class Preferences extends AbstractBillingActivity public class Preferences extends PreferenceActiv
  • R中根据字符分割字符串

    我的数据集中有一列 其中有一个我想要拆分的字符串 df data frame col c BrBkRY BBkRBr YBRG RBBk 这是我想用来有条件分割的向量 sep c Br Bk R Y B G 这就是最终的样子 我是用手做的
  • 如何将 Maven 嵌入到我的应用程序中?

    我想将 Maven 或能够发挥所有作用的库嵌入到我的 Java 应用程序中 要点 这是我想要执行的两项任务 1 在本地存储库中发布 jar2 在私有企业存储库 Nexus 中发布jar 所有必需的 jar 必须位于公共 Maven 存储库中
  • 烧瓶蓝图模板文件夹

    我的烧瓶应用程序布局是 myapp run py admin init py views py pages index html main init py views py pages index html init py 文件为空 管理
  • RestKit、CoreData 和 Swift - 我似乎无法取回结果

    我已经在一个新的基于 Swift 的应用程序 当前是 XCode 6 beta 3 中成功设置了 RestKit 到 CoreData 的映射实现 我知道导入映射正在通过我的 RestKit JSON 调用进行工作 因为我可以检查 sqli
  • 如何将WTL和ATL添加到Visual Studio C++ Express 2008

    我开始在家使用Visual Studio C Express 2008 但里面没有ATL 如何将 ATL 添加到 Visual Studio C Express 2008 ATL 7 1 现在是Windows 驱动程序套件 http www
  • 哪些版本的 IE 支持 PNG 图标?

    在这个旧的 StackOverflow 帖子中 https stackoverflow com questions 1344122 favicon png vs favicon ico why should i use pngs inste
  • 如何检查数组是否是多维的? (jQuery)

    我有两个 AJAX JSON 响应数组 一维 fili Chif Bart deme Bomb Jyui Joiu FDPi Doen abcd drog MAIC Jasi abcd Jere Jibi 三个维度 5 2 N L 7 C
  • 通过 D3 绘制 HTML 表格不会更新现有数据

    我正在使用 D3 绘制 HTML 表格 输入后效果很好 当我将新项目添加到数据集合时 它会正确地将新项目添加到表中 问题是每当我更新集合中的现有对象 下面的 backgroundJobs 集合中的对象 时 当我重新运行 D3 代码来同步表时
  • 如何使用 srcset 延迟加载图像?

    我在用着slick js http kenwheeler github io slick 构建一个旋转木马 但是 即使我将属性从src to data lazy在我滚动到该图像之前 图像仍然会被加载 我怀疑这是因为我有srcset在我的图像
  • 这是一种新的排序算法吗? [用Java和伪代码实现]

    我知道这可能是一个愚蠢的问题 也许是今天最愚蠢的问题 但我不得不问 这种排序算法是我发明的吗 昨天 我对基于交换的排序算法有了一点启发 今天 我实现了它 并且成功了 它可能已经存在 因为有许多不那么流行的排序算法几乎没有或根本没有相关信息
  • Django - 在外键对象确实存在的情况下设置 ManyToMany 属性时,序列化程序抛出“无效的 pk - 对象不存在”

    所以下面我有一些代码来测试某人创建帖子并且该帖子有一个功能hash tag在本例中是 video 该代码采用Post body并使用正则表达式查找以 开头的任何单词 如果是 那么它会创建或获取HashTag来自HashTag桌子 然后设置该