我有一个已经存在的Django模型,我想要复制,而且由于ForeignKeys和ManyToManys之间的相关名称冲突,我无法找到一个简单的方法.
举个例子,让我们调用我目前拥有Dog的模型:
class Dog(models.Model):
name = models.CharField()
owner = models.ForeignKey('myapp.Owner')
breeds = models.ManyToMany('myapp.Breed', help_text="Remember, animals can be mixed of multiple breeds.")
我想与其他地方一起使用此模型的完全重复,使用不同的数据库表和名称.我尝试使用abstract base class:
class AnimalAbstract(models.Model):
name = models.CharField()
owner = models.ForeignKey('myapp.Owner')
breeds = models.ManyToMany('myapp.Breed', help_text="Remember, animals can be mixed of multiple breeds.")
class Meta:
abstract = True
class Dog(AnimalAbstract):
pass
class Cat(AnimalAbstract):
pass
由于related_name冲突,此操作失败.
有没有办法自动复制这样的模型而不显式重新定义每个ForeignKey和ManyToMany?
先发制人地回答问题:是的,我知道multi-table inheritance,我不想用它.我也知道我可以简单地将这一切存储在同一个表中,并使用proxy models与自定义管理器自动过滤掉错误类型的动物,但我也不希望它 – 我想要它们在不同的数据库表上.
最佳答案
https://docs.djangoproject.com/en/1.8/topics/db/models/#abstract-related-name
若要解决此问题,当您在抽象基类(仅)中使用related_name时,名称的一部分应包含%(app_label)和%(类)s.
>%(class)s由使用该字段的子类的低级名称替换.
>%(app_label)s由子类包含在其中的应用程序的小写名称替换.每个安装的应用程序名称必须是唯一的,并且每个应用程序中的模型类名称也必须是唯一的,因此生成的名称最终会有所不同.
例如:
class Dog(models.Model):
name = models.CharField()
owner = models.ForeignKey(
'myapp.Owner',
related_name="%(app_label)s_%(class)s_dogs")
breeds = models.ManyToMany(
'myapp.Breed',
help_text="Remember, animals can be mixed of multiple breeds.",
related_name="%(app_label)s_%(class)s_dogs")