调用 create() 时出现“类型错误”。您可能需要将该字段设置为只读,或者重写 create() 方法

2023-11-23

不知道这里发生了什么。我正在尝试通过 Django-rest-framework 创建一个新实例。我究竟做错了什么?

有一些只读字段被提交回来。 我尝试通过将它们标记为只读read_only_fields在序列化器中,以及将它们指定为editable=False在模型的字段内。

注意:如果可能的话,我宁愿避免指定我自己的创建方法。这应该通过文档中的标准功能来工作here

发布以下内容时:

{
  "displayName": "New test",
  "backgroundColour": "#4d3567",
  "foregroundColour": "#FFFFFF",
  "helpText": "test",
  "description": "test",
  "comment": "test."
}

我越来越:

TypeError at /api/v1/classifications/
Got a `TypeError` when calling `ClassificationLabel.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `ClassificationLabel.objects.create()`. You may need to make the field read-only, or override the ClassificationLabelListSerializer.create() method to handle this correctly.

模型.py:

class ClassificationLabel(models.Model):
    """
    this model is used to create all instances of classifications 
    labels that will be displayed to a user
    """
    displayName = models.CharField('Classification label display name', max_length = 32)
    helpText = models.TextField('Explanatory text about this label', max_length = 140, blank=True)
    backgroundColour = models.CharField('Hex code for background colour including Alpha', max_length=8)
    foregroundColour = models.CharField('Hex code for foreground colour include Alpha', max_length=8)
    description = models.TextField('Description of this label', max_length = 256, blank=True)
    comment = models.TextField('Internal comments for this label', max_length = 1024, blank=True)
    lastChanged = models.DateTimeField('last changed timestamp', auto_now=True, editable=False)
    identifier = models.CharField('Classification label ID', max_length = 128, blank=True, editable=False)
    revision = models.PositiveIntegerField('Revision number for this label', default=1, editable=False)
    #placeholder for lastChangedBy

    def clean(self):
        #the following code generates a unique identifier and checks it for collisions against existing identifiers
        if not self.identifier:
            stringCheck = False
            while stringCheck is False:
                newString = str(uuid.uuid4())
                newString.replace('-', '')
                doesStringExist = ClassificationLabel.objects.filter(identifier=newString).count()
                if doesStringExist == 0:
                    stringCheck = True
            self.identifier = newString

    def __str__(self):
        return self.displayName + " - " + self.identifier

    def save(self, force_insert=False, force_update=False):
        self.revision += 1
        super(ClassificationLabel, self).save(force_insert, force_update) # Call the "real" save() method.

序列化器:

class ClassificationLabelListSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClassificationLabel
        fields = ('displayName', 'helpText', 'identifier', 'backgroundColour', 'foregroundColour', 'comment', 'description', 'lastChanged', 'revision')
        #read_only_fields = ('identifier', 'lastChanged', 'revision',)

views.py

class ClassificationLabelList(mixins.ListModelMixin,generics.GenericAPIView, mixins.CreateModelMixin):
queryset = ClassificationLabel.objects.all()
serializer_class = ClassificationLabelListSerializer

def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

似乎已经解决了这个问题更新的 save() 方法似乎已经解决了这个问题。更新的代码如下:

    def save(self, *args, **kwargs):
        self.revision += 1
        super(ClassificationLabel, self).save() # Call the "real" save() method.

也许在你的序列化器中尝试这样的事情,

class ClassificationLabelListSerializer(serializers.ModelSerializer):
    lastChanged = serializers.DateTimeField(read_only=True)
    identifier = serializers.CharField(read_only=True)
    revision = serializers.IntegerField(read_only=True)
    class Meta:
        model = ClassificationLabel
        fields = ('displayName', 'helpText', 'identifier', 'backgroundColour', 'foregroundColour', 'comment', 'description', 'lastChanged', 'revision')

    def create(self, validated_data):
        return ClassificationLabel.objects.create(**validated_data)

另外,编辑 models.py 中的保存方法,

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

调用 create() 时出现“类型错误”。您可能需要将该字段设置为只读,或者重写 create() 方法 的相关文章

随机推荐

  • eax 在 pt_regs 结构中的哪里?仅存在斧头

    我正在尝试使用pt regs用于获取和设置寄存器的结构 例如eax 但是编译错误告诉我pt regs没有该成员eax 但是 我能够得到ax登记 谁能告诉我发生了什么事吗 我正在使用 32 位 Ubuntu linux3 0 0核心 再次感谢
  • 检查数组中是否存在对象

    我有一个包含多个人物对象的数组 该对象如下所示 id 1 name Max Muster email email protected language German 现在 我在另一个数组中找到了对象 它们看起来并不完全相同 id 1 nam
  • 如果 Alamofire 图像中存在磁盘缓存图像,则使用磁盘缓存图像

    我正在使用阿拉莫火图像库来缓存下载的图像 Code import UIKit import AlamofireImage class ViewController UIViewController IBOutlet weak var fir
  • 如何让 Spoon 为 Espresso 测试截图?

    我一直在努力追随有关让 Spoon 1 1 14 为失败的 Espresso 测试截取屏幕截图的说明 配置此功能的最佳方法是什么自定义 Espresso FailureHandler 这是我目前正在做的事情 public class Mai
  • 阅读 WP8 上的 SSL 证书详细信息

    出于安全原因 我想阅读证书详细信息 例如到期日期或 CN 通常网络类中有一些可用的属性 允许检查证书 WP8 实现中缺少此功能 我还尝试创建一个 SslStream 但也无法获取任何证书详细信息 例如远程证书在 net 4 5 上 var
  • jQuery Mobile 更改下拉所选选项并刷新它

    我正在编写 jQuery 移动应用程序 我正在通过以下语句更改下拉选择的选项 DataBaseNames val db 我确信传递了正确的数据库值 因为我通过警报检查了它 当我深入下拉菜单时 它还显示所选的正确文本 但下拉菜单本身未显示所选
  • 将文件流式传输到 Pylons 中的 HTTP 响应

    我有一个 Pylons 控制器操作 需要将文件返回给客户端 该文件位于网络根目录之外 因此我不能直接链接到它 当然 最简单的方法是 with open filepath rb as f response write f read 这可行 但
  • 使用 pandas.DataFrame.interpolate 将行添加到 DataFrame

    我有一个具有以下格式的 Pandas 数据框 Frequency Value 1 10 2 8 2 20 2 5 3 30 2 2 4 40 2 3 我想用pandas DataFrame interpolate为了在频率 35 处添加一条
  • 为什么我的 vim 不知道我的别名?

    我使用了 alias ruby ruby1 9 1 所以我可以用这个执行我的 ruby 红宝石 123 rb or 红宝石1 9 1 123 rb 但在我的 vim 中 我使用 ruby 并得到 bin bash ruby 找不到命令 我必
  • 如何避免 Vscode 中将头文件放在与 src 不同的目录中时出现错误

    好吧 我在 VSCode 中遇到了错误问题 基本上我决定重新组织并将我的头文件移动到一个单独的文件夹 include 中 我的目录简单如下 build include SDL2 SDL2 Image someHeaderFile1 h so
  • 导致 java.lang.IllegalStateException: Post Too Large in tomcat / mod_jk 的原因

    为了增加允许的最大帖子大小 需要调整哪些配置以及它位于哪里 Apache Tomcat 默认情况下对其接受的 HTTP POST 请求的最大大小设置限制 在 Tomcat 5 中 此限制设置为 2 MB 当您尝试上传大于 2 MB 的文件时
  • PHP 非阻塞函数

    我有一个项目 其中用户通过表单上传图像 服务器则执行一些缩略图 缩略图制作过程非常慢 因此我认为使用非阻塞函数调整图像大小可能是一个很好的解决方案 我的意思是 服务器处理表单 有更多字段 向用户提供 ok 反馈 然后调用缩略图功能 我怎样才
  • 为什么切换服务器后 Laravel 会话在 Safari 和 IE 中会失败?

    带有 Webmin Apache Centos 6 Laravel 应用程序和旧数据库架构的新 VPS 服务器 在旧的共享主机上一切正常 但在 VPS 上由于某种原因 Laravel 的会话存储 Laravel 3 0 不再在 Safari
  • 有没有简单的方法来突出面膜?

    如果我有像这样的面具 我有一个图像 大小与面具相同 就像 我想突出显示图像中的蒙版 如果我用其他语言 我只是 正如你所看到的 结果图像有一个透明红展示面具 我希望在 OpenCV 中实现这一点 所以我写这段代码 include
  • Erlang 消息可以发送哪些类型?

    主要是想知道能不能发function在分布式 Erlang 设置中的消息中 在机器 1 上 F1 Fun gt hey end gen server call on other machine F1 在机器 2 上 handler call
  • 如何在 Android ImageView 上添加标记/图钉?

    我想问如何在 imageView 上实现或添加标记 我使用 svglib 渲染了 SVG 并使用了 customImageView 以便我可以缩放和平移图像 这是我如何使用 customImageView 的代码 Override publ
  • WinForms 文本框的“KeyPress”事件丢失?

    我正在尝试在文本框 WinForm 中添加 KeyPress 事件 this textBox1 KeyPress new System Windows Forms KeyPressEventHandler CheckKeys 这是 Chec
  • 如何使用 Newtonsoft Json.Net 反序列化接口

    我有这个类层次结构 public class ProxyBotsSnapshotLogEntryDetails IBotsSnapshotLogEntryDetails public ICollection
  • 在 Rstudio 中解决项目根目录

    当您在 RStudio 中打开或创建项目时 工作目录会自动更改为项目的目录 但是 如果您要保存文件或在其他子目录中工作 则更改工作目录通常会很方便 在每个脚本中管理这一点可能会很痛苦 是否有一个始终指向项目根目录的变量 也可由 Knit H
  • 调用 create() 时出现“类型错误”。您可能需要将该字段设置为只读,或者重写 create() 方法

    不知道这里发生了什么 我正在尝试通过 Django rest framework 创建一个新实例 我究竟做错了什么 有一些只读字段被提交回来 我尝试通过将它们标记为只读read only fields在序列化器中 以及将它们指定为edita