我有以下型号:
class A(models.Model):
name = models.CharField(max_length=50)
content_type = models.ForeignKey(ContentType)
Run Code Online (Sandbox Code Playgroud)
该模型应该是某些继承树中的根模型,而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)
Run Code Online (Sandbox Code Playgroud)
事情是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)
Run Code Online (Sandbox Code Playgroud)
但我不喜欢它.是否有更"礼貌"的方式来检查ForeignKey
属性是否已设置?