1

我正在开发一个模型,该模型通过简单的 hack 实现只读属性:

from pynamodb.models import Model


class MyModel(Model):
    […]
    updated_at = UTCDateTimeAttribute()

    def save(self):
        self.updated_at = datetime.now(timezone.utc)
        return super().save()

有了这个技巧,用户在创建实例时需要提供updated_at,即使该值将被忽略。

这个直接的问题可以通过 来解决updated_at = UTCDateTimeAttribute(null=True),但现在模型发出的信号updated_at可能不是响应的一部分,但事实并非如此。

基本上,我如何向用户表明他们不能为字段提供值(理想情况下尝试设置updated_at应该会导致错误),但是该模型的每个实例都会有该字段的值?

4

1 回答 1

1

您可以重写__init__方法MyModel来检查updated_at传递的属性是否存在,如果存在则引发异常:

class MyModel(Model):
    def __init__(self, hash_key=None, range_key=None, _user_instantiated=True, **attributes):
        if "updated_at" in attributes.keys():
            raise IllegalArgumentException
        super().__init__(
            hash_key=hash_key,
            range_key=range_key,
            _user_instantiated=_user_instantiated,
            **attributes,
        )

检查正在保存的对象是否与数据库中的对象具有相同值的save和方法的类似更新应该足以满足上述要求。updateupdated_at

于 2021-05-18T04:28:18.937 回答