У меня есть следующая модель:
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
атрибут установлен?
Будет ли работать, если вы исследуете self.content_type_id
вместо self.content_type
?