与peewee和python的外键关系

Jus*_*tin 5 python orm peewee

我正在尝试使用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()
Run Code Online (Sandbox Code Playgroud)

后来,我导入了"收藏"

for value in collection:
Collection(**value).save()
Run Code Online (Sandbox Code Playgroud)

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

for value in collectionFiles:
    File(**value).save()
Run Code Online (Sandbox Code Playgroud)

在值dict中,有一个带有"identifier"键的关键字对和一个应该与Collection标识符关键字相关联的值.

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

ValueError: invalid literal for int() with base 10: 'somevalue'
Run Code Online (Sandbox Code Playgroud)

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

我意识到我做错了.我的假设是每个表中的唯一标识符值将应用外键.阅读文档后,外观设置看起来有点不同.我需要做些什么吗?

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

组成类File的值

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

col*_*fer 7

我认为你的领域的命名可能是混乱的一部分.您可以将其称为"集合",而不是从文件 - >集合"标识符"中调用外键.

class File(datab):
  collection = ForeignKeyField(Collection, related_name='files')
  name = CharField()
Run Code Online (Sandbox Code Playgroud)

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

File.create(collection='foobar', name='/secret/password')
Run Code Online (Sandbox Code Playgroud)

最好做这样的事情:

collection = Collection.get(Collection.identifier == 'foobar')
File.create(collection=collection, name='/secret/password')
Run Code Online (Sandbox Code Playgroud)

最后要注意,如果Collection"identifier"是唯一的主键,则可以这样设置:

class Collection(datab):
  identifier = CharField(primary_key=True)
  title = CharField()
Run Code Online (Sandbox Code Playgroud)