DRF将参数添加到Model.save(…)

2024-10-06 11:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Invoice模型,在被重写的Invoice.save()方法中有一个recalculate参数

我希望Invoice总是被重新计算,除非它是使用序列化程序创建的

可能吗

序列化程序使用create,所以我不确定如何做到这一点。(它是一个ModelSerializer)


Tags: 方法模型程序参数序列化savecreateinvoice
1条回答
网友
1楼 · 发布于 2024-10-06 11:31:12

您可以创建一个mixin来重写create方法并传入recalculate参数,而不调用super().create(),然后在序列化程序中使用它:例如InvoiceSerializer(CreateMixin, serlializers.ModelSerializer)

class CreateMixin:
    def create(self, validated_data, recalculate):
        raise_errors_on_nested_writes('create', self, validated_data)

        ModelClass = self.Meta.model

        info = model_meta.get_field_info(ModelClass)
        many_to_many = {}
        for field_name, relation_info in info.relations.items():
            if relation_info.to_many and (field_name in validated_data):
                many_to_many[field_name] = validated_data.pop(field_name)

        try:
            instance = ModelClass(**validated_data)
            '''
            your custom logic with recalculate argument
            '''


        except TypeError:
            tb = traceback.format_exc()
            msg = (
                    'Got a `TypeError` when calling `%s.%s.create()`. '
                    'This may be because you have a writable field on the '
                    'serializer class that is not a valid argument to '
                    '`%s.%s.create()`. You may need to make the field '
                    'read-only, or override the %s.create() method to handle '
                    'this correctly.\nOriginal exception was:\n %s' %
                    (
                        ModelClass.__name__,
                        ModelClass._default_manager.name,
                        ModelClass.__name__,
                        ModelClass._default_manager.name,
                        self.__class__.__name__,
                        tb
                    )
            )
            raise TypeError(msg)

        # Save many-to-many relationships after the instance is created.
        if many_to_many:
            for field_name, value in many_to_many.items():
                field = getattr(instance, field_name)
                field.set(value)

        return instance

相关问题 更多 >