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

时间:2012-09-12 06:45:27

标签: python django django-models

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

当我尝试这个时:

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

结果字典只有直接字段。我还想获得与Model对象相关的外键。我怎么能这样做?

6 个答案:

答案 0 :(得分:28)

obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__

答案 1 :(得分:7)

怎么样:

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

通过明确命名所有字段,它应该至少为您提供外键ID(虽然我还没有验证)。

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

答案 2 :(得分: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

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

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

HTH现在。

答案 3 :(得分:0)

如果您想使用相关模型,可能需要查看Django serialization

答案 4 :(得分: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}

答案 5 :(得分:0)

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

我最终读到的是'Generic Display Views',它似乎能够将对象实例或对象的查询集发送到模板。然后,您可以访问model.field之类的对象,或者即使它是外键字段model.foreignmodel.foreignmodelfield

所以对我来说非常有用。这是在我建立了一堆定制的“dict”之后。不同班主任的方法。这对我帮助很大。但是,您必须阅读通用视图以及如何自定义它们以真正获得所需的详细信息。

-Matt