У меня есть следующая модель:
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
?