2016-08-22 2 views
4

Я пытался реализовать hashids в моделях django. Я хочу приобрести hashid на основе модели id, например, при модели id=3, тогда хэш-кодировка должна быть такой: hashid.encode(id). Дело в том, что я не могу получить id или pk, пока не сохраню их. То, что у меня на уме, - это получить последние объекты id и добавить 1 на них. Но это не решение для меня. Может ли кто-нибудь помочь мне разобраться?Внесите 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

этот не создает хешид после сохранения – Zorig

+0

Вы создаете статьи через командную строку? Этот метод не запускает метод save() при создании экземпляра модели. – Hybrid

+0

Нет, я создал статью через панель администратора. это потому, что измененная дата и дата создания не равны ??? – Zorig

0

Я думаю, что hashids всегда возвращают одно и то же значение для определенного идентификатора. Поэтому вы можете просто вычислить его перед его отображением (используя теги шаблонов).

Но если вы все еще хотите, чтобы сохранить его, один путь, чтобы сохранить поле Хашида в представлениях, как это:

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

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

(я не знаю, если это лучший подход, но он работал me!)

+0

Хорошо, что это хороший подход из представлений – Zorig

Смежные вопросы