Django: проверьте, установлен ли атрибут внешнего ключа

У меня есть следующая модель:

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

Эта модель должна быть корневой моделью в некотором дереве наследования, а атрибут content_type - это своего рода намек на то, какой тип действительно хранится. Очевидно, я должен был прозрачно вычислять content_type при создании экземпляра. Я думаю, в __init__. Но есть проблема - есть два основных контекста, в которых создаются экземпляры:

  • 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?

Ответ 1

Работает ли он, если вы рассматриваете self.content_type_id вместо self.content_type?