【问题标题】:DRF serializer method field returns previous field data after updating in update() methodDRF 序列化器方法字段在 update() 方法中更新后返回先前的字段数据
【发布时间】:2021-07-14 16:59:55
【问题描述】:

我有一个序列化器,我需要在其中更新相关模型并使用序列化器方法字段返回更新后的值。

class MultiUserSerializer(serializers.ModelSerializer):
    
    shared_user = UserBaseSerializer(required=False)
    enforce_mfa = serializers.SerializerMethodField(default=False, required=False)

    class Meta:
        model = MultiUser
        depth = 1
        fields = [
            'shared_user',
            'enforce_mfa',
        ]

    def update(self, instance, validated_data):
        
        if self.context['request'].data.get('enforce_mfa'):
            # Say enforce_mfa = True
            enforce_mfa = json.loads(str(self.context['request'].data.get('enforce_mfa')).lower())

            preference, create = Preference.objects.get_or_create(user=instance.shared_user)
            preference.enforce_mfa = enforce_mfa
            preference.save()

            print('This prints True: {}'.format(preference.enforce_mfa))

        instance_ = super().update(instance, validated_data)

        return instance_

    def get_enforce_mfa(self, obj):

        try:
            a = obj.shared_user.preference.enforce_mfa
            print('This remains False {}'.format(a))
            return a
        except ObjectDoesNotExist:
            return False  # Return False in case of preference does not exist.

update()方法内更新Preference模型后,值更新成功,但get_enforce_mfa()方法返回的值还是之前的值。

说如果enforce_mfa之前的值是False,并且该值更新为True,它仍然返回False get_enforce_mfa() 方法。

【问题讨论】:

  • 您是否尝试过使用 perform_update 而不是 update ?您可以添加在保存对象之前或之后发生的行为。

标签: django-rest-framework


【解决方案1】:

使用refresh_from_db():

    def get_enforce_mfa(self, obj):

        try:
            preference = obj.shared_user.preference
            preference.refresh_from_db()
            return preference.enforce_mfa
        except ObjectDoesNotExist:
            return False  # Return False in case of preference does not exist.

这是link的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2020-11-14
    • 2021-03-19
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多