【问题标题】:Django Rest Framework ModelSerializer pk field not existing on updateDjango Rest Framework ModelSerializer pk 字段在更新时不存在
【发布时间】:2017-03-05 13:46:12
【问题描述】:

当我尝试更新我的模型时,我的序列化程序不包含 pk 字段。 我的序列化器看起来像这样:

class BookSerializer(serializers.ModelSerializer):
    pages = PageSerializer(many=True)

    class Meta:
        model = Book
        fields = ('pk', 'tite', 'pages')

当我从 http.get 调用中获取我的书时,数据包含 pk 键。但是当我使用 http.put 方法发布这些数据时,在我的序列化程序中的 valid_data 中捕获的数据不包含 pk 字段。我必须在每个序列化程序上定义这个 pk 吗?我认为 DRF 3 默认应该这样做。

【问题讨论】:

    标签: serialization django-rest-framework primary-key


    【解决方案1】:

    无论如何,您都不想更新pk。默认情况下,它是只读的,因此您不会将其用于写操作。 如果你真的需要,把它标记为可读写。

    【讨论】:

    • 如果我想更新嵌套字段,还有其他方法吗?
    • 为什么会有?在嵌套序列化程序上使用 extra_kwargs 非常简单。
    • 是的,我们不想更新 pk,但我们可能想读取 pk,知道对象的 id 是什么。
    【解决方案2】:

    您可能会在 self.instance 中找到 pk,还有我们正在更新的对象的 id 和所有其他值

    if self.instance:
       pk = self.instance.pk
    

    【讨论】:

      【解决方案3】:

      在序列化器中显式声明字段:

          id = serializers.IntegerField()
      

      或者如果那是一个嵌套序列化程序,用户required=False,你也可以添加新对象:

          id = serializers.IntegerField(required=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 2013-08-26
        • 2015-09-19
        • 1970-01-01
        • 2017-03-21
        • 2021-08-08
        相关资源
        最近更新 更多