2016-03-20 5 views
0

Ich habe eine Verpflichtung, wenn ein User-Uploads von Dateien zu Dateisammlungmongoengine wie eine Datei kopieren

class File(Document): 
    user = ReferenceField(User) 
    file = FileField() 
    type = StringField(choices = ('project', 'uploads')) 

Der Benutzer kann dann eine Datei für die Aufnahme in ein Projekt einreichen können. Wenn die Datei akzeptiert wird, wird sie kopiert und in der Project-Sammlung gespeichert.

class Project(Document): 
    file = ReferenceField(File) 

file = File.objects(id = id) 
copy = File(user = current_user, file = file.file, type = 'project').save() 
Project(file = copy).save() 

Wenn jedoch der Benutzer entscheidet, seine Uploads Ordner zu reinigen,

files = File.objects(user = current_user, type = 'uploads') 
files.delete() 

er von Entfernen von Dateien verhindert wird, die die Projektsammlung vorgelegt wurden. Was ist der beste Weg, dies zu vermeiden? Gibt es eine Möglichkeit, eine Datei zu kopieren, so dass jede Datei eine 1: 1-Korrespondenz mit einem Eintrag in einer Sammlung hat? Wenn Sie dann ein Dokument aus einer Sammlung entfernen, wird auch die Datei entfernt.

Antwort

0

Hier ist meine Lösung. Entfernen Sie zuerst "user" und "type" und fügen Sie "references" zur Dateisammlung hinzu. Dies ermöglicht die Verfolgung aller Verweise auf die spezifische Datei.

class File(Document): 
    file = FileField() 
    references = db.ListField(db.GenericReferenceField()) 

Jetzt, wenn ein Benutzer eine Datei hochlädt, wird die Referenz des Benutzers der Referenzliste der Datei hinzugefügt.

Wenn eine Datei für ein Projekt verwendet wird, wird die Projektreferenz der Referenzliste der Datei hinzugefügt.

Wenn ein Benutzer eine Datei löscht, wird die Referenzliste überprüft, um festzustellen, ob der Benutzer die einzige Referenz ist. Ist dies der Fall, wird die Datei gelöscht. Wenn weitere Referenzen vorhanden sind, wird sie aus der Liste entfernt und die Datei wird nicht gelöscht.

if user in file.references: 
    if len(file.references) > 1: 
      file.update(pull__references = user) 
    else: 
      file.file.delete() 
      file.delete()