小编And*_* V.的帖子

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

我有以下型号:

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实例有两个主要的上下文:

  1. a = A(name='asdfdf') # here we must fill in content_type
  2. 通过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_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)
Run Code Online (Sandbox Code Playgroud)

但我不喜欢它.是否有更"礼貌"的方式来检查ForeignKey属性是否已设置?

django django-models

10
推荐指数
1
解决办法
8046
查看次数

标签 统计

django ×1

django-models ×1