【发布时间】:2021-01-15 22:55:12
【问题描述】:
Django 版本:3.1.0,MySQL 后端
我的模型上有一个JSONField:
class Employee(models.Model):
address = models.JSONField(
encoder=AddressEncoder,
dedocer=AddressDecoder,
default=address_default
)
那么encoder 看起来像这样:
class AddressEncoder(DjangoJSONEncoder):
def default(self, o):
if isinstance(o, Address):
return dataclasses.asdict(o)
raise TypeError("An Address instance is required, got an {0}".format(type(o)))
那么address_default 看起来像这样:
def address_default():
encoder = AddressEncoder()
address = Addres(...)
return encoder.encode(address)
目前我已将address_default 设置为返回dict。虽然它实际上应该返回一个 Address 实例。当我更改它以使address_default 返回Address 的实例时,将引发错误TypeError: Object of type Address is not JSON serializable。但是,在地址实际上是Address 的实例的代码的其他部分中,不会引发错误。所以自定义的AddressEncoder似乎并没有用在address_default提供的值上。
当Employee 上的地址attribute 设置为例如string,不会引发错误。这可能与Why is Django not using my custom encoder class 中的解释有关。 AddressEncoder中的代码没有被执行。
问题:
设置address_default 和Encoder/Decoder 以使address 属性可以而且只能是Address 的实例的正确方法是什么?
【问题讨论】:
标签: mysql json python-3.x django