【问题标题】:Django pass field from serializer to model.save() that is not present in the modelDjango 将字段从序列化程序传递到模型中不存在的 model.save()
【发布时间】:2022-01-18 17:23:42
【问题描述】:

我需要将序列化程序中存在但模型中不存在的字段传递给模型保存方法(我有复杂的保存逻辑,我想根据这些字段在对象创建中做出一些决定)。我怎样才能做到这一点?我试图添加 non_db_field = property 模型,但我仍然收到错误 MyModel() got an unexpected keyword argument 'negative_amount'

假设我的模型是

class MyModel(AbstractModel):
    field1 = models.DateTimeField()
    field2 = models.BigIntegerField()

我的序列化器是

class MyModelSerializer(AbstractSerializer):
    field3 = serializers.BooleanField(required=False)

    class Meta(AbstractSerializer.Meta):
        model = MyModel
        fields = '__all__'

我的观点是

class MyModelViewSet(AbstractViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

【问题讨论】:

  • 你能分享你在这里描述的模型、序列化器和视图集吗?

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


【解决方案1】:

您应该在serializer.save 方法中处理此行为,例如,您可以像这样从validated_data 弹出它:

    def save(self, **kwargs):
        self.validated_data.pop("negative_amount")

        return super().save(**kwargs)

【讨论】:

    【解决方案2】:

    您可以在序列化程序中使用fields=['field1', 'field2', 'field3'] 而不是fields='__all__'

    【讨论】:

      【解决方案3】:

      我找到了一个部分基于 Sharpek 的答案和部分基于 this 答案的解决方案:

      serializer 我重写 save 方法:

          def save(self, **kwargs):
              if 'field3' in self.validated_data:
                  kwargs['field3'] = self.validated_data.pop('field3')
              return super().save(**kwargs)
      

      models 中,我重写 init 方法并定义字段:

          field3 = None
          def __init__(self, *args, **kwargs):
              if 'field3' in kwargs:
                  self.field3 = kwargs.pop('field3')
              super(Reading, self).__init__(*args, **kwargs)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2013-08-28
        • 2021-11-08
        • 2016-08-23
        • 2018-09-10
        • 2019-10-26
        • 1970-01-01
        相关资源
        最近更新 更多