Раньше у меня были такие модели:
class AssemblyAnnotation(models.Model):
assembly = models.ForeignKey(Assembly)
type = models.ForeignKey(AssemblyAnnotationType)
...
def clean(self):
from django.core.exceptions import ValidationError
if not self.type.can_annotate_aliases and self.assembly.alias_of_id is not None:
raise ValidationError('The selected annotation type cannot be applied to this assembly.')
В результате новая AssemblyAnnotation (прикрепленная через строку) могла иметь только подмножество значений для своего атрибута типа в зависимости от родительской сборки.
Это прекрасно сработало.
Теперь пришло время применить эти аннотации к другим объектам, которые немного отличаются:
class ObjectAnnotation(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
type = models.ForeignKey(AssemblyAnnotationType)
...
def clean(self):
from django.core.exceptions import ValidationError
if self.content_type == ContentType.objects.get_for_model(Assembly):
if not self.type.can_annotate_aliases and self.content_object.alias_of_id is not None:
raise ValidationError('The selected annotation type cannot be applied to this assembly.')
Как видите, я хочуприменяются те же правила.Тем не менее, есть проблема.GenericInline, который я сейчас использую, не устанавливает self.content_type до запуска моего метода clean ().
Есть ли способ обойти это?Я делаю это неправильно?
Спасибо за помощь.