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

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

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

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

  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)

Вещь 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 атрибут установлен?

10
задан Dominic Rodger 5 January 2010 в 09:50
поделиться

1 ответ

Будет ли работать, если вы исследуете self.content_type_id вместо self.content_type ?

29
ответ дан 3 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: