Django:检查是否设置了外键属性

时间:2010-01-05 09:47:50

标签: django django-models

我有以下型号:

class A(models.Model):
    name = models.CharField(max_length=50)
    content_type = models.ForeignKey(ContentType)

这个模型应该是某些继承树中的根模型,而content_type属性是一种关于实际存储类型的提示。 显然,我应该在创建实例时透明地计算content_type。我想,在__init__。但是存在一个问题 - 创建A实例有两个主要的上下文:

  1. a = A(name='asdfdf') # here we must fill in content_type
  2. QuerySet机制与*args元组。在这种情况下,我不应该填写content_type
  3. 所以,我正在写:

    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_typeReverseSingleRelatedObjectDescriptor实例,__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属性?

1 个答案:

答案 0 :(得分:29)

如果您检查self.content_type_id而不是self.content_type吗?

是否有用