Реализуйте хешид в Django

Я пытался реализовать хешид в моделях Django. Я хочу приобрести хешид на основе модели id например, когда модель id=3 тогда хеш-кодирование должно быть таким: hashid.encode(id), Дело в том, что я не могу получить id или pk, пока не сохраню их. Что я имею в виду, так это получить последние объекты id и добавить 1 на них. Но это не решение для меня. Может кто-нибудь помочь мне разобраться???

Джанго модель это:

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) 

2 ответа

Я бы сказал, чтобы сохранить, если еще нет идентификатора, поэтому он не запускает код каждый раз. Вы можете сделать это, используя наследование 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']) 

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

Но если вы все еще хотите сохранить его, один из способов - сохранить поле хэш-функции в представлениях следующим образом:

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

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

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

Другие вопросы по тегам