如何创建具有M2M和FK关系的Django模型的精确副本

时间:2015-07-02 03:58:58

标签: python django django-models

我有一个已经存在的Django模型,我想要复制,而且由于ForeignKey和{{ManyToMany之间的相关名称冲突,我无法找到一个简单的方法。 1}} S上。

例如,让我们调用我目前拥有的模型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冲突,此操作失败。

有没有办法在不明确重新定义每个ForeignKeyManyToMany的情况下自动复制这样的模型?

先发制人地回答问题:是的,我知道multi-table inheritance,我不想使用它。我也知道我可以将这一切存储在同一个表格中并使用proxy models与自定义管理器自动过滤掉错误类型的动物,但我也不想要它 - 我希望它们分开数据库表。

1 个答案:

答案 0 :(得分:2)

https://docs.djangoproject.com/en/1.8/topics/db/models/#abstract-related-name

要解决此问题,当您在抽象基类(仅)中使用related_name时,名称的一部分应包含%(app_label)s%(class)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")