加载包含自然键的Django设备

2024-04-29 16:06:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如何加载Django fixture,以便通过自然键引用的模型不会与预先存在的记录冲突?在

我试图从我的后端加载一个完整的jjerangim,这是没有意义的。在

正如我所理解的Django的自然键特性,为了完全支持dumpdata和loaddata的使用,您需要在模型中定义一个natural_key方法,并在模型的管理器中定义一个get_by_natural_key方法。在

例如,我有两个模型:

class PersonManager(models.Manager):
    def get_by_natural_key(self, name):
        return self.get(name=name)

class Person(models.Model):

    objects = PersonManager()

    name = models.CharField(max_length=255, unique=True)

    def natural_key(self):
        return (self.name,)

class BookManager(models.Manager):
    def get_by_natural_key(self, title, *person_key):
        person = Person.objects.get_by_natural_key(*person_key)
        return self.get(title=title, person=person)

class Book(models.Model):

    objects = BookManager()

    author = models.ForeignKey(Person)

    title = models.CharField(max_length=255)

    def natural_key(self):
        return (self.title,) + self.author.natural_key()
    natural_key.dependencies = ['myapp.Person']

我的测试数据库已经包含了一个示例Person和Book record,我用它来生成fixture:

^{pr2}$

我希望能够使用这个fixture并将其加载到数据库的任何实例中以重新创建记录,而不管它们是否已经存在于数据库中。在

但是,当我运行python manage.py loaddata myfixture.json时,我得到了一个错误:

IntegrityError: (1062, "Duplicate entry '1-1' for key 'myapp_person_name_uniq'")

为什么Django试图重新创建Person记录,而不是重用已经存在的记录?在


Tags: keyname模型selfgetbyreturntitle
2条回答

实际上loaddata不应该与数据库中的现有数据一起工作,它通常用于模型的初始加载。 看看这个问题的另一种方法:Import data into Django model with existing data?

结果表明,该解决方案需要对Django的loaddata命令进行非常小的修补。由于Django开发人员不太可能接受这样的补丁,所以我在我的包中添加了forked it各种与Django管理相关的增强功能。在

密钥代码更改(第189-201行,loaddatanaturally.py)只需要调用get_natural_key()来查找循环中遍历反序列化对象的任何现有pk。在

相关问题 更多 >