【问题标题】:Django not recognizing field override for Current User in SerializerDjango 无法识别序列化程序中当前用户的字段覆盖
【发布时间】:2018-09-29 12:56:27
【问题描述】:

我在 django rest 框架中自动设置用户时遇到问题。在我的 models.py 中,我有以下内容:

Models.py

class Space(models.Model):
   creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

Serializers.py

class SpaceSerializer(serializers.HyperlinkedModelSerializer):
    creator = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CreateOnlyDefault(serializers.CurrentUserDefault()))

    class Meta:
        model = Space
        fields = '__all__'

意图是在创建过程中通过 API 设置 creator 字段。当我发出 POST 请求来创建模型时,我收到以下错误:

“/api/space/NOT NULL 约束处​​的 IntegrityError 失败: apiapp_space.creator_id

我假设序列化程序甚至没有使用此字段覆盖,因为当我在我的模型中设置 null=True 时,它​​似乎在创建者字段设置为 null 的情况下正确保存。

请注意,我也尝试过使用 serializers.ModelSerializer。

如何让 django 识别此字段覆盖?

【问题讨论】:

  • 删除read_only=True怎么样?
  • @JerinPeterGeorge 这似乎已经成功了,但考虑到他们实际上建议在文档中使用它,这似乎很奇怪 - 请参阅 django-rest-framework.org/api-guide/serializers/… 也宁愿不将该字段公开给自动生成的 API 表单,但如果必须,我可以忍受它!
  • 去掉read_only=True后是否有效?
  • @JerinPeterGeorge 是的。但是,这允许其他用户根据需要更改此字段,这是不可取的。
  • @我发布了一个答案。请试一试

标签: python django django-models django-forms django-rest-framework


【解决方案1】:

the release notes for v3.8 对此进行了介绍。

对于只读字段,调用保存时需要传递值:

def perform_create(self, serializer):
    serializer.save(creator=self.request.user)

CreateOnlyDefault 用作模型上 unique_together 验证的值。

这是 v3.8 中的一项重大更改,需要在其他地方允许正确的行为。 (以前具有默认值的只读字段被认为是可写的,默认值被用作写入值。最终结果证明这不是一个好主意。)

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多