gpt4 book ai didi

python - Django:基于JSONField动态设置模型实例属性

转载 作者:行者123 更新时间:2023-11-29 13:49:04 24 4
gpt4 key购买 nike

我有一个关于如何在启动模型实例时动态设置模型属性的问题。

我正在使用一个带有原生 PostgreSQL JSONField 的简单模型:

from django.db import models
from django.contrib.postgres.fields import JSONField

class Booking(models.Model):
data = JSONField(blank=False, encoder=DjangoJSONEncoder)

有什么方法可以根据模型实例化时存储在“数据”字段中的值来设置模型实例的属性吗?

我希望能够做到这一点:

from .models import Booking

b = Booking.objects.create(data={'foo':'bar'})
b.foo # this should yield 'bar'

我最初的想法是覆盖模型的 init 方法并使用 setattr() 设置实例属性,但是 Django 文档中强烈建议不要覆盖模型的 init 方法.

还有其他方法可以实现吗?感谢您的帮助。

PS:我知道我可以像这样访问存储在模型实例“数据”中的值:booking.data['foo'],所以这不是我要找的。

最佳答案

您可以简单地实现 __getattr__ Hook 你的模型,即:

class Booking(models.Model):

# ...
def __getattr__(self, name):
try:
return self.data[name]
except KeyError:
try:
return super(Boooking, self).__getattr__(name)
except AttributeError:
raise AttributeError(
"object %s has no attribute '%s'" % (type(self).__name__, name)
)

但除非您真的确信您的 json 内容将始终具有相同的结构,否则我建议您不要这样做 - 使用普通的 instance.data[key] 语法更为明确。

关于python - Django:基于JSONField动态设置模型实例属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43890363/

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