Django model反向关联名称的方法
如果你在ForeignKey或ManyToManyField字段上使用related_name属性,你必须总是为该字段指定一个唯一的反向名称。但在抽象基类上这样做就会引发一个很严重的问题。因为Django会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同(这里面就包括related_name)。
当你在(且仅在)抽象基类中使用related_name时,如果想绕过这个问题,名称中就要包含'%(app_label)s'和‘%(class)s'。
‘%(class)s'会替换为子类的小写加下划线格式的名称,字段在子类中使用。
‘%(app_label)s'会替换为应用的小写加下划线格式的名称,应用包含子类。每个安装的应用名称都应该是唯一的,而且应用里每个模型类的名称也应该是唯一的,所以产生的名称应该彼此不同。
fromdjango.dbimportmodels classBase(models.Model): m2m=models.ManyToManyField(OtherModel,related_name="%(app_label)s_%(class)s_related") classMeta: abstract=True classChildA(Base): pass classChildB(Base): pass
ChildA.m2m字段的反向名称是common_childa_related,而ChildB.m2m字段的反向名称是rare_childb_related。这取决于你如何使用‘%(class)s'和'%(app_label)s来构造你的反向名称。如果你没有这样做,Django就会在验证model(或运行migrate)时抛出错误。
如果你没有在抽象基类中为某个关联字段定义related_name属性,那么默认的反向名称就是子类名称加上'_set',它能否正常工作取决于你是否在子类中定义了同名字段。例如,在上面的代码中,如果去掉related_name属性,在ChildA中,m2m字段的反向名称就是childa_set;而ChildB的m2m字段的反向名称就是childb_set。
以上这篇Djangomodel反向关联名称的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。