当您使用defer(...)
查询命令时,Django会返回与原始模型不同的类。如何在使用延迟字段时动态获取模型的名称?
在代码中:
obj_nodefer = model_class.objects.filter(title="foo")[0]
model_name = str(type(obj_nodefer)) # Works just fine
obj_defer = model_class.objects.filter(title="foo").defer("content")[0]
model_name = str(type(obj_defer)) # Does't return the right name because of defer above.
如何从obj_defer
获取模型的名称?
答案 0 :(得分:5)
在延迟类上,您还可以使用以下方式获取原始类而不操纵__class__.__name__
字符串:
obj._meta.concrete_model
'product.models.ProductModelName'
obj._meta.concrete_model._meta.app_label
'product'
obj._meta.concrete_model._meta.model_name
'productmodelname'
答案 1 :(得分:4)
要获得非延迟模型,请执行
t = type(obj)
if t._deferred:
t = t.__base__
答案 2 :(得分:0)
您可以访问obj.__class__
>>> print obj.__class__
<class 'product.models.Product_Deferred_name'>
>>> print obj.__class__.__name__
Product_Deferred_name
>>> print obj.__class__.__name__.split("_")[0]
Product
如果您的型号名称包含_
,
>>> print obj.__class__.__name__.replace("_Deferred_name","")
Product
答案 3 :(得分:0)
在django 1.4中,延迟类的构造如下:
def deferred_class_factory(model, attrs):
"""
Returns a class object that is a copy of "model" with the specified "attrs"
being replaced with DeferredAttribute objects. The "pk_value" ties the
deferred attributes to a particular instance of the model.
"""
class Meta:
proxy = True
app_label = model._meta.app_label
# The app_cache wants a unique name for each model, otherwise the new class
# won't be created (we get an old one back). Therefore, we generate the
# name using the passed in attrs. It's OK to reuse an existing class
# object if the attrs are identical.
name = "%s_Deferred_%s" % (model.__name__, '_'.join(sorted(list(attrs))))
name = util.truncate_name(name, 80, 32)
overrides = dict([(attr, DeferredAttribute(attr, model))
for attr in attrs])
overrides["Meta"] = Meta
overrides["__module__"] = model.__module__
overrides["_deferred"] = True
return type(name, (model,), overrides)
所以,从理论上讲,你应该通过
进入真正的班级type(type(deferred))