如何将django Model对象转换为包含其所有字段的dict ?理想情况下,所有内容都包含外键和带有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")
Run Code Online (Sandbox Code Playgroud)
在终端中,我做了以下事情:
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()
Run Code Online (Sandbox Code Playgroud)
我想将其转换为以下字典:
{'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}
Run Code Online (Sandbox Code Playgroud)
回答不满意的问题:
我正在尝试整合第三方Django应用程序,该应用程序做出了不幸的继承决定django.contrib.auth.models.User,这对于可插拔应用程序来说是一个很大的禁忌.引用Malcolm Tredinnick:
更重要的是,就像在Python中一样,你不能使用Django的模型继承来"低估".也就是说,如果您已经创建了User实例,那么您不能在没有深思熟虑的情况下,使该实例对应于您尚未创建的子类实例.
好吧,我正处于需要将此第三方应用程序与现有用户实例集成的情况.所以,如果假设我确实愿意在封面下捅,我有什么选择?我知道这不起作用:
extended_user = ExtendedUser(user_ptr_id=auth_user.pk)
extended_user.save()
Run Code Online (Sandbox Code Playgroud)
也没有例外,但是它打破了各种各样的东西,首先django.contrib.auth.models.User用空字符串覆盖所有列...
假设django中有以下类结构:
class Base(models.Model)
class Derived(Base)
Run Code Online (Sandbox Code Playgroud)
这个基础对象(只是Base,而不是Derived)
b = Base()
b.save()
Run Code Online (Sandbox Code Playgroud)
我想从 b 创建一个派生对象。哪种方法是正确的?我试过了:
d = Derived(b)
d = Derived(base_ptr=b)
Run Code Online (Sandbox Code Playgroud)
谢谢
注意:我认为这是一个与“如何在 Django 中从模型基类转到派生类? ”不同的问题,因为我需要的是从现有基(且仅基)对象创建一个新的派生对象。在该问题中,它检查派生类是否已存在,然后返回它。就我而言,派生对象不存在。
我有一个Django项目有两个模型:申请人和客户,其中客户是申请人的子类.我想要一些允许用户将现有Applicant实例添加为客户端的方法.我已经有申请人实例的视图,所以我认为在该页面上有一个客户端模型表单会这样做,但是从文档中看起来不像你可以使用超类的实例初始化模型表单.我知道我可以通过让代码直接进入数据库并在子类表中添加一个字段来实现这一点,但是有更多的Django-y方法吗?