gpt4 book ai didi

python - 具有自然键的 Django loaddata 不查询正确的外键

转载 作者:太空狗 更新时间:2023-10-30 02:11:39 32 4
gpt4 key购买 nike

这是我的问题。我正在尝试加载一些与另一个模型具有自然键关系的数据。

我修改了父模型以生成自然键。

我使用命令从旧数据库中导出数据:

manage.py dumpdata resources.image -n --indent 4 > images.json

然后我尝试使用以下命令导入新数据库:

manage.py loaddata images.json

此时我得到错误:

IntegrityError: Problem installing fixtures: The row in table 'resources_image' 
with primary key '340' has an invalid foreign key: resources_image.voyage_id contains
a value '41890' that does not have a corresponding value in voyage_voyage.id.

它正在尝试查询 voyage_voyage.id 而不是 get_by_natural_key 函数中指定的 voyage_voyage.voyage_id。我仔细检查了一下,夹具中的键在 voyage_id 字段中。下面是我的代码和示例夹具。

父模型:

# for parsing natural key
class VoyageManager(models.Manager):
def get_by_natural_key(self, voyage_id):
return self.get(voyage_id=voyage_id)


class Voyage(models.Model):

# for parsing natural key
objects = VoyageManager()


voyage_id = models.IntegerField("Voyage ID (can be empty)", null=True, blank=True)

# A WHOLE BUNCH OF FIELDS

# generate natural key
def natural_key(self):
return (self.voyage_id)


class Meta:
ordering = ['voyage_id',]
verbose_name = 'Voyage'
verbose_name_plural = "Voyages"

def __unicode__(self):
return "Voyage #%s" % str(self.voyage_id)

子模型:

class Image(models.Model):
voyage = models.ForeignKey(Voyage, null=True, blank=True)

# MANY OTHER FIELDS

class Meta:
verbose_name = "Image"
verbose_name_plural = "Images"

ordering = ["date"]

夹具:

{
"pk": 340,
"model": "resources.image",
"fields": {
"category": 56,
"voyage": 41890,
"date": 1873,
"description": "blah blah blah",
"language": " ",
"creator": null,
"title": "Catherine Zimmermann-Mulgrave, \nc.1873",
"source": "blah blah blah",
"ready_to_go": true,
"file": "images/5AF81DA065049ACE0EC8E236C445F5BC.JPG",
"order_num": 0
}
}

最佳答案

我终于明白了

此函数期望输入来自元组:

def get_by_natural_key(self, voyage_id):
return self.get(voyage_id=voyage_id)

此函数在指定 --natural 标志时生成元组

def natural_key(self):
return (self.voyage_id)

这里的技巧是,当你有一个只有一个元素的元组时,它会恢复到它的原始类型(str、int 等)以强制一个单一元素元组,你需要一个尾随的“,”所以修复是:

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

关于python - 具有自然键的 Django loaddata 不查询正确的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21151544/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com