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

标签 python django django-models

我有一个已经存在的 Django 模型,我想复制它,但由于 ForeignKey 之间的相关名称冲突,我想不出一个简单的方法多对多

例如,让我们将我目前拥有的模型称为 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使用自定义管理器来自动过滤掉错误类型的动物,但我也不希望这样——我希望它们位于单独的数据库表中。

最佳答案

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")

关于python - 如何创建具有 M2M 和 FK 关系的 Django 模型的精确副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31175363/

相关文章:

python - 为什么尝试更新 geoDjango Point 对象时没有保存任何内容?

python - 计算月牙的倾斜度

python - 什么时候应该使用 os.name vs. sys.platform vs. platform.system()?

Django:在 UpdateView 中添加自定义 CSS

python-3.x - 在 Django 中为特定用户上传图像

python - 在Django中按日期计算记录数

python - 我们如何检查函数是否在 Python 中返回多个值?

python - 来自嵌套 JSON 的 pandas 数据框

Django:实例在多对多关系之前需要有一个主键值

python - 猴子在另一个应用程序中修补 Django 应用程序