gpt4 book ai didi

python - 如何让 create 语句尊重自定义 Django 字段中的 "from_db_value"?

转载 作者:行者123 更新时间:2023-12-01 07:12:29 26 4
gpt4 key购买 nike

假设我有一个自定义字段,如下所示:

class Temperature:
pass

class TemperatureField(models.DecimalField):
def from_db_value(self, value, expression, connection):
if value is not None:
return Temperature(value)
return None

def to_python(self, value):
if isinstance(value, Temperature):
return value
if value is None:
return value
kelvin = super().to_python(value)
return Temperature(kelvin)

def get_prep_value(self, value):
if isinstance(value, Temperature):
value = value.kelvin
return super().get_prep_value(value)

def get_db_prep_save(self, value, connection):
if isinstance(value, Temperature):
return connection.ops.adapt_decimalfield_value(value.kelvin, self.max_digits, self.decimal_places)
elif isinstance(value, (float, int)):
return connection.ops.adapt_decimalfield_value(Decimal(value), self.max_digits, self.decimal_places)
elif isinstance(value, (Decimal,)):
return connection.ops.adapt_decimalfield_value(Decimal(value), self.max_digits, self.decimal_places)

class Test(models.Model):
temp = TemperatureField(max_digits=10, decimal_places=2)

例如,当从数据库加载数据时,以下内容按预期工作:

>>>t = Test.objects.first()
>>>t.temp
<extra_fields.fields.Temperature object at 0x10e733e50>
>>> type(t.temp)
<class 'extra_fields.fields.Temperature'>

问题在于 from_db_value 的逻辑未扩展到 create 语句:

>>>t = Test.objects.create(temp=1)
>>>t.temp
1
>>>type(t.temp)
<class 'int'>

有没有办法将此逻辑扩展到 create 方法,而不覆盖模型管理器? IE,我可以在我的字段类中执行此操作吗?

我认为 Temperature 类的具体功能并不相关,但如果您想了解,请参阅 answer我的另一个问题。

最佳答案

这是一个known issue

有一个thread on the Django developers mailing list更详细地讨论了它,并且一致认为应该更新文档以警告这一点(这还没有发生)。

解决方案是从数据库刷新对象:

t.refresh_from_db()

或强制清洁它:

t.full_clean()

关于python - 如何让 create 语句尊重自定义 Django 字段中的 "from_db_value"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58139447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com