我之前有这样的模型:
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(通过内联附加)只能为其type属性提供值的子集,具体取决于父程序集。
这很有效。
现在,是时候将这些注释应用于略有不同的其他对象:
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在运行clean()方法之前没有设置self.content_type。
这有什么办法吗?我做错了吗?
感谢您的帮助。
答案 0 :(得分:0)
右侧是否会返回列表
if self.content_type == ContentType.objects.get_for_model(Assembly):
?
我认为你需要做if self.content_type in ContentType.objects.get_for_model(Assembly):
答案 1 :(得分:0)
我和你一样使用它并且它起到了预期的作用。这是我的代码:
在模特中:
class GroupFlagIntermediate(models.Model):
group_flag = models.ForeignKey(GroupFlag, related_name='flag_set')
content_type = models.ForeignKey(ContentType, verbose_name='Flag Type')
flag_pk = models.CharField('Flag PK', max_length=100, blank=True, default='')
flag = generic.GenericForeignKey('content_type', 'flag_pk')
def clean(self):
from django.core.exceptions import ValidationError
if not self.is_valid_flag(self.content_type.model_class()):
raise ValidationError('The selected flag is not a real Flag.')
在管理员中:
class GroupFlagIntermediateInline(admin.TabularInline):
model = GroupFlagIntermediate
class GroupFlagAdmin(admin.ModelAdmin):
list_display = ('name', ...)
inlines = [GroupFlagIntermediateInline]
admin.site.register(GroupFlag, GroupFlagAdmin)
经过一些测试后,我发现content_type
和object_id
(我的情况下为flag_pk
)字段是在clean()调用之前设置的,但是GenericForeignKey
( <{1}}在我的情况下)没有。