簡體   English   中英

與peewee和python的外鍵關系

[英]Foreign key relationship with peewee and python

我正在嘗試使用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()

后來,我導入了“收藏”

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

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

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

在值dict中,有一個帶有“identifier”鍵的關鍵字對和一個應該與Collection標識符關鍵字相關聯的值。

但是我收到一條錯誤消息:

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

如果我將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'}

我認為你的領域的命名可能是混亂的一部分。 您可以將其稱為“集合”,而不是從文件 - >集合“標識符”中調用外鍵。

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

最后要注意,如果Collection“identifier”是唯一的主鍵,則可以這樣設置:

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

(我不熟悉peewee,但如果它像Django那么這應該有效。)

class File有一個ForeignKeyField和一個CharField ,所以你不能簡單地用File(**value)保存一對字符串。 您需要先將字符串轉換為鍵,如下所示:

for value in collectionFiles:
    identifier = value['identifier']
    name = value['name']
    collection_entity = Collection.objects.filter(identifier=identifier).get()
    File(identifier=collection_entity, name=name).save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM