32

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

当我尝试这个时:

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

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

4

6 回答 6

31
obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__
于 2012-09-12T07:21:25.720 回答
7

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

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

暂时 HTH。

于 2014-06-29T02:50:38.030 回答
7

怎么样:

model_to_dict(instance, fields=[field.name for field in instance._meta.fields])

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

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

于 2013-11-21T00:57:40.817 回答
0

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

于 2012-09-12T07:03:22.613 回答
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}
于 2016-03-03T23:40:00.577 回答
0

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

我最终阅读的是https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-display/,它似乎能够发送对象实例或查询集对象沿着模板。然后您可以访问对象,例如model.field,或者即使它是外键字段,model.foreignmodel.foreignmodelfield

所以它对我来说非常有用。这是在我在不同的类管理器中构建了一堆自定义的“to-dict”方法之后。这对我帮助很大。但是您必须阅读通用视图以及如何自定义它们才能真正获得所需的详细信息。

-马特

于 2016-03-21T21:02:54.770 回答