如何将 Django 模型对象转换为包含 所有 字段的字典?理想情况下,所有内容都包括外键和带有 editable=False 的字段。
让我详细说明。假设我有一个如下所示的 Django 模型:
from django.db import models
class OtherModel(models.Model): pass
class SomeModel(models.Model):
normal_value = models.IntegerField()
readonly_value = models.IntegerField(editable=False)
auto_now_add = models.DateTimeField(auto_now_add=True)
foreign_key = models.ForeignKey(OtherModel, related_name="ref1")
many_to_many = models.ManyToManyField(OtherModel, related_name="ref2")
在终端中,我做了以下事情:
other_model = OtherModel()
other_model.save()
instance = SomeModel()
instance.normal_value = 1
instance.readonly_value = 2
instance.foreign_key = other_model
instance.save()
instance.many_to_many.add(other_model)
instance.save()
我想将其转换为以下字典:
{'auto_now_add': datetime.datetime(2015, 3, 16, 21, 34, 14, 926738, tzinfo=<UTC>),
'foreign_key': 1,
'id': 1,
'many_to_many': [1],
'normal_value': 1,
'readonly_value': 2}
回答不尽如人意的问题:
如何将 Django 模型对象转换为字典并仍然拥有它们的外键?
原文由 Zags 发布,翻译遵循 CC BY-SA 4.0 许可协议
有许多方法可以将实例转换为字典,具有不同程度的极端情况处理和与所需结果的接近程度。
1.
instance.__dict__
返回
这是迄今为止最简单的,但缺少
many_to_many
,foreign_key
命名错误,并且其中有两个不需要的额外内容。2.
model_to_dict
返回
这是唯一带有
many_to_many
的一个,但缺少不可编辑的字段。3.
model_to_dict(..., fields=...)
返回
这比标准
model_to_dict
调用更糟糕。4.
query_set.values()
返回
这与
instance.__dict__
的输出相同,但没有额外的字段。foreign_key_id
仍然是错误的,many_to_many
仍然缺失。5.自定义功能
django 的代码
model_to_dict
有大部分答案。它明确删除了不可编辑的字段,因此删除该检查并获取许多字段的外键 ID 会导致以下代码按预期运行:虽然这是最复杂的选项,但调用
to_dict(instance)
给了我们想要的结果:6.使用序列化器
Django Rest Framework 的 ModelSerializer 允许您从模型自动构建序列化程序。
回报
这几乎与自定义函数一样好,但 auto_now_add 是一个字符串而不是日期时间对象。
奖励回合:更好的模型打印
如果你想要一个具有更好的 python 命令行显示的 django 模型,让你的模型子类如下:
因此,例如,如果我们这样定义我们的模型:
调用
SomeModel.objects.first()
现在给出如下输出: