Django Rest Framework 在创建记录后设置一个只读字段

2024-02-08

我在用着Django 2.x and Django REST Framework.

我有一个模型contact作为外键

class AmountGiven(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    contact = models.ForeignKey(Contact, on_delete=models.PROTECT)
    amount = models.FloatField(help_text='Amount given to the contact')
    given_date = models.DateField(default=timezone.now)
    created = models.DateTimeField(auto_now=True)

和序列化器一样

class AmountGivenSerializer(serializers.ModelSerializer):
    mode_of_payment = serializers.PrimaryKeyRelatedField(queryset=ModeOfPayment.objects.all())
    contact_detail = ContactSerializer(source='contact', read_only=True)
    contact = serializers.PrimaryKeyRelatedField(queryset=Contact.objects.all())

    class Meta:
        model = AmountGiven
        depth = 1
        fields = (
            'id', 'contact', 'contact_detail', 'amount', 'given_date', 'created'
        )

contact创建新记录时需要字段。但我不想contact一旦创建即可修改。

但是当我只发送amount with PUT它说的方法

{
    "contact": [
        "This field is required."
    ]
}

当我使用PATCH方法,它工作正常,但如果传递一些其他值contact,正在更新contact以及。

我要实现contact field not-required同时更新现有记录。而且即使通过了,也使用之前的数据,而不是设置新的数据。

Trial 2

我尝试覆盖contact请求中的字段更改为之前存储的值,以便万一发生更改contact通过或未通过contact通过后,会保存之前的一个。

因此,在视图集中添加函数

def update(self, request, *args, **kwargs):
    obj = self.get_object()
    request.data['contact'] = obj.contact_id
    return super().update(request, *args, **kwargs)

但这给出了错误

This QueryDict instance is immutable

Use __init__序列化器的方法使其在更新对象时读取:

class AmountGivenSerializer(serializers.ModelSerializer):  

    def __init__(self, *args, **kwargs):
        """If object is being updated don't allow contact to be changed."""
        super().__init__(*args, **kwargs)
        if self.instance is not None:
            self.fields.get('parent').read_only = True
            # self.fields.pop('parent') # or remove the field


    mode_of_payment = serializers.PrimaryKeyRelatedField(queryset=ModeOfPayment.objects.all())
    contact_detail = ContactSerializer(source='contact', read_only=True)
    contact = serializers.PrimaryKeyRelatedField(queryset=Contact.objects.all())

    class Meta:
        model = AmountGiven
        depth = 1
        fields = (
            'id', 'contact', 'contact_detail', 'amount', 'given_date', 'created'
        )

Using self.context['view'].action不推荐,因为当使用 DRF 之外的序列化器时它将不起作用,例如。在正常的 Django 视图中。最好使用self.instance因为它适用于任何情况。

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

Django Rest Framework 在创建记录后设置一个只读字段 的相关文章

随机推荐

  • 如何在 Leiningen REPL 中热重载文件保存的命名空间

    使用 leiningen REPL 时 有没有办法使文件或 ns 在文件保存时自动重新加载到 repl 中 目前 我通过在 repl 中输入以下内容来重新加载 ns use sample ns reload all 但是我可以让它在文件保存
  • 当 url 包含空格时,Angular ng 风格的背景图像

    我正在尝试使用角度将背景图像应用到 divng style只要 URL 不包含空格 它就可以正常工作 ng style background image url parentIMGLink 当 URL 中有空格时 例如parentIMGLi
  • 使用 jmeter 录制时何时使用“跟随重定向”和“自动重定向”。

    我想知道之间的区别遵循重定向 and 自动重定向使用 Jmeter 进行记录时 另外 这两者一起使用时会产生什么效果从 HTML 检索所有嵌入资源 Redirect automatically 不会将重定向视为单独的请求 然而Follow
  • Google 地图有时无法加载

    我的网站上有一个使用 Maps API 创建的嵌入式地图 它在大学会加载 9 10 次 但在家里永远不会加载 有没有办法解决这个问题 使其始终加载 这是它正在使用的脚本
  • 如何使用Python对图像进行base64编码

    我有来自设备的数据流 我需要将其转换为 jpeg 然后对其进行 Base64 编码以通过网络传输 到目前为止 我的 Python 2 7 代码如下所示 from PIL import Image import io image Image
  • 记住点击后退按钮时 ajax 添加的数据

    我有一个搜索页面 其中每个搜索结果都使用 AJAX 添加到页面中 这样我可以让用户搜索例如齐柏林飞艇 然后再次搜索金属乐队但将其添加到与先前搜索相同的结果列表中 我的问题是 当用户单击记录的链接 然后单击后退按钮 返回到搜索结果时 火狐 7
  • Android TextView NullPointerException 与 onTouchListener 和 onClickListener 4.0

    我有一个 TextView 我为它分配了 onTouchListener 和 onClickListener myTextView setOnTouchListener new OnTouchListener public boolean
  • Visual Studio 2008:关闭 css 类验证

    有没有办法阻止 Visual Studio 2008 在编辑页面和用户控件时检查 css 类是否存在 将虚拟样式表放在每个用户控件上似乎很荒谬 是的 有办法 转到工具 gt 选项 gt 文本编辑器 gt CSS gt CSS 特定 这里有一
  • 什么时候使用静态变量?

    我目前正在 C 中做一个需要大量渲染的项目 并且在几乎所有类中 都有一个用于缩放渲染的整数类型常量值 我知道我可以在一个地方将这个常量定义为普通变量 然后将其传递 但 这看起来确实很麻烦 什么时候可以在 C 中使用静态变量 解决我的问题的最
  • iOS 推送通知中的多行标题

    我正在为一个具有 iOS 和 Android 版本的应用程序集成 FCM 目前 对于 iOS 我想以多行形式发送标题 我该怎么做呢 我正在尝试使用 Firebase 控制台进行测试 但似乎没有什么对我有用 我尝试过这些 n br n r n
  • Python-请求如何在发布之前调用js函数来计算一些值?

    我使用请求 2 2 1 来登录网址http tx3 netease com logging php action login 但是这个url的登录逻辑与Django的csrf token机制不同 即 当你获取这个url时 有两个导入值for
  • jQuery Spinner:非数值

    我正在使用 jQuery Spinner 设置了最小值 0 和最大值 500 如何防止用户在输入框中直接输入非数字值 或0 500范围之外的值 当用户使用微调器按钮时 最小值和最大值起作用 但在输入表单中键入内容时则不起作用 You can
  • 如何使用 Spring Boot 通过电子邮件发送文件而不先将其存储在存储中? [复制]

    这个问题在这里已经有答案了 我正在开发一个 Spring Boot 应用程序 在我的项目中 我正在创建一个 xlsx 文件 然后我必须使用 Spring Boot 通过电子邮件发送 我可以使用 apache poi 创建该文件 但稍后通过邮
  • 忽略 CalledProcessError

    我正在使用subprocess模块和check output 在我的Python脚本中创建一个虚拟shell 它对于返回零退出状态的命令运行良好 但是对于不返回零退出状态的命令 它会返回异常 而不打印在普通shell的输出中显示的错误 例如
  • Javascript 函数的工作方式类似于 ActionScript 的 Normalize(1)

    我需要一个返回 xy 点标准化数字的公式 类似于 actionscript 的 normalize 函数 var normal x pt1 x pt2 x y pt1 y pt2 y normal Normalize 1 this I do
  • 带有构建和源子目录的 Makefile

    我正在尝试申请this https stackoverflow com questions 4036191 sources from subdirectories in makefile and this https stackoverfl
  • 从也是渲染目标的纹理中采样

    我知道这在技术上不受支持 据我所知 这是未定义的行为 但是从也被写入的纹理中采样真的是一件非常可怕的事情吗 我问这个问题是因为我需要从深度纹理中读取数据 我也需要写入该深度纹理 如果我不能这样做 这意味着我将不得不复制深度纹理 如果这没什么
  • DataGridView 数据绑定

    我举一个简单的例子来解释我想要的 我定义了一个名为Student 它有两个性质 Name and Subjects public class Student public string Name public List
  • 无法使用 kafkajs 连接到种子代理

    我正在尝试使用kafkajs为了创建一个卡夫卡消费者 但是 连接到 kafka 时出现错误 BrokerPool Failed to connect to seed broker trying another broker from the
  • Django Rest Framework 在创建记录后设置一个只读字段

    我在用着Django 2 x and Django REST Framework 我有一个模型contact作为外键 class AmountGiven models Model id models UUIDField primary ke