2016-08-22 3 views
4

私はhashidsをdjangoモデルで実装しようとしています。モデルのidに基づいてhashidを取得したい場合は、モデルのid=3と同じように、ハッシュエンコーディングはhashid.encode(id)のようにする必要があります。事は私がそれらを救うまで私はIDかpkを得ることができない。私が気にしているのは、最新のオブジェクトidを入手し、1を追加することです。しかし、それは私のための解決策ではありません。誰かが私はそれを把握するのに役立つことができますか?djangoでhashidを実装する

Djangoのモデルは次のとおりです。

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) 

答えて

1

何のIDがまだ存在しない場合は、コードを毎回実行されませんので、私は、保存するためにそれを言うだろう。これはTimeStampedModelの継承を使用して行うことができます。これは実際にはどのプロジェクトでも使用するのに最適です。

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

保存後にhashidが作成されない – Zorig

+0

コマンドラインで記事を作成していますか?このメソッドは、モデルインスタンスを作成するときに 'save()'メソッドを実行しません。 – Hybrid

+0

いいえ、管理パネルから記事を作成しました。変更された日付と作成された日付が等しくないためですか? – Zorig

0

私はhashidsが常に特定のidのために同じ値を返すと思います。だから、それを表示する前に(テンプレートタグを使って)計算するだけです。

しかし、あなたはまだ一つの方法は、このようなビューでhashidフィールドを保存することです、それを保存したい場合:

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

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

(それが最善の方法だ場合、私は知りませんが、それは働きました私!)

+0

これはビューからの素晴らしいアプローチです – Zorig

関連する問題