如何将Django Model对象转换为字典并仍然拥有其外键?

32 python django django-models

在我的Django应用程序中,如何将模型中的对象转换为包含Model对象的外键引用的字典?

当我尝试这个:

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
Run Code Online (Sandbox Code Playgroud)

生成的字典只有直接字段.我还想获得与Model对象相关的外键.我怎样才能做到这一点?

fre*_*lis 28

obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__
Run Code Online (Sandbox Code Playgroud)


Cha*_*had 7

怎么样:

model_to_dict(instance, fields=[field.name for field in instance._meta.fields])
Run Code Online (Sandbox Code Playgroud)

通过显式命名所有字段,它应该至少为您提供外键ID(尽管我还没有验证).

请注意,此函数不返回带有editable=False(因为它用于表单)的字段.


Edw*_*ell 6

我想我和你有同样的需要 - 我想要一个简单明了的dict表示对象.发布的其他答案(在我写的时候)不会给我这个,而序列化器虽然对他们的目的很有用,却产生了我不想要的额外信息的输出,以及一个不方便的结构.

虽然这是一个黑客,但这给了我很好的里程:

from django.core import serializers

def obj_to_dict(model_instance):
    serial_obj = serializers.serialize('json', [model_instance])
    obj_as_dict = json.loads(serial_obj)[0]['fields']
    obj_as_dict['pk'] = model_instance.pk
    return obj_as_dict
Run Code Online (Sandbox Code Playgroud)

将django_model_object包装在一个列表中,然后在解析json之后访问item 0是因为由于某种原因,序列化程序只能序列化模型对象的迭代(很奇怪).

你需要一些额外的齿轮来处理任何类型的外键字段,如果我最终需要编写它,我可能会回发(除非其他人先编辑它!).

HTH现在.


Roh*_*han 0

如果您想使用相关模型,您可能需要查看Django 序列化。