Python 如何将Django模型对象转换为字典,并且仍然保留它们的外键?

Python 如何将Django模型对象转换为字典,并且仍然保留它们的外键?,python,django,django-models,Python,Django,Django Models,在我的Django应用程序中,如何将模型中的对象转换为包含模型对象外键引用的字典 当我尝试这个: from django.forms.models import model_to_dict model_to_dict(instance, fields=[], exclude=[]) 结果字典只有直接字段。我还想获取与模型对象相关的外键。我怎样才能做到这一点呢?如果您想使用相关型号,您可能需要查看一下。如何: obj = get_object_or_404(CustomModel,id=some

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

当我尝试这个:

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])

结果字典只有直接字段。我还想获取与模型对象相关的外键。我怎样才能做到这一点呢?

如果您想使用相关型号,您可能需要查看一下。

如何:

obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__
model_to_dict(instance, fields=[field.name for field in instance._meta.fields])
通过显式命名所有字段,它至少应该为您提供外键ID(尽管我还没有验证)


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

我想我和您有同样的需求——我想要对象的简单明了的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
需要将django_model_对象包装在列表中,然后在解析json后访问项0,因为出于某种原因,序列化程序只能序列化模型对象的可序列化项(奇怪)

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


目前为止。

其他答案都不适合我。然而,这似乎起到了作用

def model_to_dict(instance, include=None, exclude=None):
    fields = instance._meta.concrete_fields
    if include is not None:
        return {f.attname: getattr(instance, f.attname) for f in fields if f.name in include}
    if exclude is not None:
        return {f.attname: getattr(instance, f.attname) for f in fields if f.name not in exclude}
    return {f.attname: getattr(instance, f.attname) for f in fields}

我想您已经为您的案例解决了这个问题,但我在搜索类似解决方案时发现了一些信息。我希望能够访问模板中的对象及其字段/属性。我只是在学django

我最后读到的是,它似乎能够将对象实例或对象查询集发送到模板。然后,您可以访问对象,如
model.field
,或者即使是foreignkey字段,也可以访问
model.foreignmodel.foreignmodelfield

所以它对我很有用。这是在我在不同的类管理器中构建了一系列定制的“todict”方法之后。这对我帮助很大。但是,您必须仔细阅读通用视图以及如何自定义它们以真正获得所需的详细信息


-Matt

似乎更适合使用此属性,而不是应用用于表单的model_to_dict函数。优点是dict属性不排除不可编辑的字段。缺点是它不包含ManyToManyField类型的字段(由于我假设的底层反向关系),它将foreghin键呈现为user=user\u id,我想在这里显示用户名。如何做到这一点?/使用select related获取queryset?如下所示:MyModel.objects.select_related('user_uuuuusername')。从技术上讲,获取(pk=some_integer)这篇文章是这篇文章的副本。。