gpt4 book ai didi

python - peewee和python的外键关系

转载 作者:太空狗 更新时间:2023-10-30 00:50:53 32 4
gpt4 key购买 nike

我正在尝试使用 peewee 设置数据库 ORM,但不清楚外键关系的使用。

from peewee import *

db = SqliteDatabase('datab.db')

class datab(Model):
class Meta:
database = db

class Collection(datab):
identifier = CharField()
title = CharField()

class File(datab):
identifier = ForeignKeyField(Collection, related_name='files')
name = CharField()

稍后,我导入了“Collections”

for value in collection:
Collection(**value).save()

最后,我遇到问题的地方是将文件添加到集合中

for value in collectionFiles:
File(**value).save()

在 value dict 中,有一个关键字对,其键为“identifier”,一个值应与 Collection identifier 关键字相关联。

但是我收到一条错误消息:

ValueError: invalid literal for int() with base 10: 'somevalue'

如果我将 File(datab): identifier Type 更改为 VarChar,它会保存数据。

我意识到我做错了。我的假设是每个表中的唯一标识符值将应用外键。阅读文档后,看起来外键设置有点不同。我需要做类似的事情吗

Collections.File.files(**values).save() ?换句话说,不是做一个数据导入,加载集合对象,然后通过peewee添加文件关联字段?

组成类文件的值

{'crc32': '63bee49d',
'format': 'Metadata',
'identifier': u'somevalue',
'md5': '34104ffce9e4084fd3641d0decad910a',
'mtime': '1368328224',
'name': 'lupi.jpg_meta.txt',
'sha1': '1448ed1159a5d770da76067dd1c53e94d5a01535',
'size': '1244'}

最佳答案

我认为您的字段命名可能是混淆的一部分。与其将文件 -> 集合中的外键称为“标识符”,不如将其称为“集合”。

class File(datab):
collection = ForeignKeyField(Collection, related_name='files')
name = CharField()

Peewee 更喜欢,在设置外键的值时,它是一个模型实例。例如,而不是做:

File.create(collection='foobar', name='/secret/password')

最好做这样的事情:

collection = Collection.get(Collection.identifier == 'foobar')
File.create(collection=collection, name='/secret/password')

作为最后的说明,如果集合“标识符”是唯一的主键,您可以这样设置:

class Collection(datab):
identifier = CharField(primary_key=True)
title = CharField()

关于python - peewee和python的外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17035758/

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