2016-07-07 5 views
2

Ich muss doppelte Dateispeicherung verhindern.Django verhindern Dateiduplikate in Sicht

tun dies Modell:

def save(self, *args, **kwargs): 
     f = self.file 
     digest = Document.gen_digest(f) 
     qs = Document.objects.filter(hash=digest).first() 
     if qs is not None: 
      self.file = qs.file 
     super(Document, self).save(*args, **kwargs) 

ich eine Lösung erreichen. Aber ich muss senden messages, wenn Duplikate Platz haben. messages erfordert request - also muss ich dies in einer view tun.

Wenn Sie dieses Beispiel jedoch in der Ansicht aufrufen, wird eine Datei mit einem anderen Namen erstellt. Dies ist das Standardverhalten.

Wie zu verhindern, Duplikate zu speichern und immer noch schmieden messages wenn entweder, ohne zu überschreiben FileStorage?

Oder ein anderer Ratschlag wäre einfach großartig!

Danke.

Antwort

2

Wie Sie bereits Speichermethode haben Arbeit, die Sie erfüllt, schlage ich Ausnahme in sie zu erhöhen und sie dann in der Ansicht behandeln: in außer Block

def save(self, *args, **kwargs): 
    f = self.file 
    digest = Document.gen_digest(f) 
    qs = Document.objects.filter(hash=digest) 
    if not qs.exists(): 
     self.file = qs.file 
    else: 
     # May be some custom DuplicateFileError 
     raise FileExistsError('Duplicate!!!') 
    super(Document, self).save(*args, **kwargs) 

Und dann Ihrer Ansicht nach Flash-Mitteilung.

Verwandte Themen