我有一个Item模型,它与另外两个模型(ItemComponent和或ItemComponentCategory(反向相关。我的想法是,在保存之前,我希望能够验证Items与另外两个模型的关系不超过4。
class Item(models.Model):
name = models.CharField(max_length=40, unique=True)
class ItemComponent(models.Model):
parent_item = models.ForeignKey(Item, related_name='components')
class ItemComponentCategory(models.Model):
parent_item = models.ForeignKey(Item, related_name='categories')
如果保存的对象将导致>4它们之间的对象关系。
我试着在这三种清洁方法中添加这样的东西:
def clean(self):
if (self.parent_item.components.count() + self.parent_item.categories.count()) > 4:
raise ValidationError(_(f'Items can have no more than 4 components and/or component categories'))
只要项目及其关系已经用4保存,并且您正在尝试添加更多关系,这似乎就有效。
但是,如果我在ItemAdmin中创建一个表格行来添加这些"子类型",如果您愿意的话。。我可以创建一个新的项目,添加尽可能多的这些子类型,并保存它,没有问题。
我在这里错过了什么?
我的问题似乎与进程的时间和顺序有关。
保存具有内联引用的管理页面时,将首先保存主页面的模型,然后保存内联对象。当试图使用模型的clean((方法根据关系进行验证时,这会带来一个问题,因为它根本不存在。
正如本文中提到的,我的解决方案似乎是修改modelAdmin函数,以确保首先保存内联对象,然后在保存主对象后验证它们。
此外,我认为这个与save_related相关的modelAdmin方法会派上用场。