2016-08-22 2 views
4

Ich habe versucht, hashids in Django-Modelle zu implementieren. Ich möchte Hash basierend auf id Modell des Modells erwerben, wenn das Modell id=3 dann Hash-Codierung sollte wie folgt sein: hashid.encode(id). Die Sache ist, dass ich ID oder PK nicht bekommen kann, bis ich sie rette. Was ich in meinem Kopf habe, ist, die neuesten Objekte id zu bekommen und 1 auf ihnen hinzuzufügen. Aber es ist keine Lösung für mich. Kann mir jemand helfen, es herauszufinden?Implementieren Hashid in Django

django Modell ist:

from hashids import Hashids 
hashids = Hashids(salt='thismysalt', min_length=4) 



class Article(models.Model): 
    title = models.CharField(...) 
    text = models.TextField(...) 
    hashid = models.CharField(...) 

    # i know that this is not a good solution. This is meant to be more clear understanding. 
    def save(self, *args, **kwargs): 
     super(Article, self).save(*args, **kwargs) 
     self.hashid = hashids.encode(self.id) 
     super(Article, self).save(*args, **kwargs) 

Antwort

1

Ich würde es nur sagen, zu retten, wenn es keine ID noch ist, so dass es nicht den Code jedes Mal ausgeführt werden. Sie können dies mit einer TimeStampedModel-Vererbung tun, die in jedem Projekt wirklich nützlich ist.

from hashids import Hashids 


hashids = Hashids(salt='thismysalt', min_length=4) 


class TimeStampedModel(models.Model): 
    """ Provides timestamps wherever it is subclassed """ 
    created = models.DateTimeField(editable=False) 
    modified = models.DateTimeField() 

    def save(self, *args, **kwargs): # On `save()`, update timestamps 
     if not self.created: 
      self.created = timezone.now() 
     self.modified = timezone.now() 
     return super().save(*args, **kwargs) 

    class Meta: 
     abstract = True 


class Article(TimeStampedModel): 
    title = models.CharField(...) 
    text = models.TextField(...) 
    hashid = models.CharField(...) 

    # i know that this is not a good solution. This is meant to be more clear understanding. 
    def save(self, *args, **kwargs): 
     super(Article, self).save(*args, **kwargs) 
     if self.created == self.modified: # Only run the first time instance is created (where created & modified will be the same) 
      self.hashid = hashids.encode(self.id) 
      self.save(update_fields=['hashid']) 
+0

dieses erstellt keine hashid nach dem speichern – Zorig

+0

Erstellen Sie Artikel über die Befehlszeile? Diese Methode führt beim Erstellen der Modellinstanz nicht die Methode 'save()' aus. – Hybrid

+0

Nein, ich habe einen Artikel über das Admin-Panel erstellt. liegt es daran, dass Änderungsdatum und Erstellungsdatum nicht gleich sind ??? – Zorig

0

Ich denke, dass Hash-IDs immer den gleichen Wert für eine bestimmte ID zurückgeben. Sie können es also einfach berechnen, bevor Sie es anzeigen (mit Vorlagen-Tags).

Aber wenn Sie es noch sparen wollen, ist eine Möglichkeit, die Hashid Feld in den Ansichten wie diese speichern:

instance = Article() 
instance.title = 'whatever...' 
instance.text = 'whatever...' 
instance.save() 

hashids = Hashids()  
instance.hashid = hashids.encode(instance.id) 
instance.save() 

(ich weiß nicht, ob es der beste Ansatz ist, aber es funktionierte für ich!)

+0

gut, das ist eine nette Vorgehensweise aus Ansichten – Zorig

Verwandte Themen