2013-06-11 15 views
5

Ich versuche, eine Datenbank ORM mit peewee einrichten und bin nicht klar auf die Verwendung von Fremdschlüssel Beziehungen. SpäterFremdschlüssel Beziehung mit Peewee und Python

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

, mache ich einen Import von "Sammlungen"

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

Schließlich, wo ich Probleme fügt die Dateien in den Sammlungen

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

Im Wert dict, Es gibt ein Schlüsselwortpaar mit dem Schlüssel "identifier" und einen Wert, der dem Schlüsselwort Collection identifier zugeordnet werden sollte.

Allerdings erhalte ich eine Fehlermeldung:

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

Wenn ich die Datei (datab) ändern: Bezeichner Typ VarChar, sie die Daten gespeichert werden.

Ich merke, dass ich es falsch mache. Meine Annahme war, dass der eindeutige Bezeichnerwert in jeder Tabelle den Fremdschlüssel anwenden würde. Nach dem Lesen der Dokumentation sieht es so aus, als ob die Fremdschlüsseleinstellung etwas anders ist. Muss ich etwas tun wie

Collections.File.files (** Werte) .save()? Mit anderen Worten, anstatt einen Datenimport zu machen, das Sammelobjekt zu laden und dann die Datei zugeordneten Felder durch peewee hinzuzufügen?

Werte, die Klasse Datei

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

Antwort

6

Ich denke, die Benennung Ihrer Felder Teil der Verwirrung sein könnte. Anstatt den Fremdschlüssel von Datei -> Sammlung "Bezeichner" aufzurufen, könnten Sie ihn stattdessen "Sammlung" nennen.

Peewee bevorzugt, dass es beim Festlegen des Werts eines Fremdschlüssels eine Modellinstanz ist. Zum Beispiel, anstatt zu tun:

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

Es ist vorzuziehen, um so etwas zu tun:

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

Als abschließende Bemerkung, wenn die Collection „Kennung“ der eindeutige Primärschlüssel ist, können Sie einstellen, es geht so:

+0

Danke, ich habe gesehen, dass die Fremdschlüssel eine Modellinstanz sind, aber die Implementierung war unklar. Es gibt mehr Felder für Sammlung und Dateimodelle als das, was ich hier gezeigt habe - weshalb ich die Kwargs verwende. Ich denke, mit den zwei Antworten werde ich das herausfinden können. – Justin

+0

danke! Ich konnte es in Gang bringen. – Justin

1

(Ich bin nicht vertraut mit peewee, aber wenn es wie Django ist dann sollte dies funktionieren.) Bilden

class File eine ForeignKeyField und eine CharField, so Sie können nicht einfach ein Paar Zeichenfolgen mit File(**value) speichern. Sie müssen zuerst einen String in einen Schlüssel konvertieren, wie folgt aus:

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() 
+0

Hmm mein Diktat scheint die richtigen Schlüsselpaare zu haben, bevor ich die Speicherfunktion versuche. – Justin

+0

@Justin, ich denke, der Grund, warum Sie den 'ValueError' bekommen, ist, weil er eine Ganzzahl für den Bezeichner erwartet, nicht 'u'somevalue'. Die Ganzzahl ist die ID der zugehörigen 'Collection' mit dieser Kennung (so verknüpft eine Datenbank ein ForeignKeyField). –

+0

Ich bemerkte, dass der Code nicht ganz richtig war, und ich reparierte es, um 'collection_entity' zu verwenden. –

Verwandte Themen