我有以下型号:
class A(models.Model):
name = models.CharField(max_length=50)
content_type = models.ForeignKey(ContentType)
这个模型应该是某些继承树中的根模型,而content_type属性是一种关于实际存储类型的提示。
显然,我应该在创建实例时透明地计算content_type
。我想,在__init__
。但是存在一个问题 - 创建A实例有两个主要的上下文:
a = A(name='asdfdf') # here we must fill in content_type
QuerySet
机制与*args
元组。在这种情况下,我不应该填写content_type
所以,我正在写:
def __init__(self, *args, **kwargs):
super(A, self).__init__(*args, **kwargs)
if self.content_type is None: # << here is the problem
self.content_type = ContentType.objects.get_for_model(self)
事件是self.content_type
是ReverseSingleRelatedObjectDescriptor
实例,__get__
覆盖,因此在未设置的情况下抛出它。是的,我可以这样做:
def __init__(self, *args, **kwargs):
super(A, self).__init__(*args, **kwargs)
try:
self.content_type
except Exception, v:
self.content_type = ContentType.objects.get_for_model(self)
但我不喜欢它。是否有更“礼貌”的方式来检查是否设置了ForeignKey
属性?
答案 0 :(得分:29)
如果您检查self.content_type_id
而不是self.content_type
吗?