2015-03-29 3 views
0

У меня есть простая модель, которую я хотел бы включить хэш идентификатора модели в:Как получить доступ к id модели Django внутри объекта модели?

class pick(models.Model): 
    id_hash = models.TextField(default=hashlib.md5(id).hexdigest()) 
    symbol = models.CharField(max_length=5) 
    buy_datetime = models.DateTimeField() 
    buy_price = models.DecimalField(max_digits=8, decimal_places=2) 
    sell_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True) 
    buy_quantity = models.IntegerField() 
    current_price = models.DecimalField(max_digits=8, decimal_places=2) 
    def hash(self): 
     return hashlib.md5(str(self.id)).hexdigest() 
    def __str__(self): 
     return "{} {} {} {} {} {}".format(self.symbol,self.buy_datetime,self.buy_price,self.sell_price,self.buy_quantity, self.current_price) 

, конечно, для id_hash, у меня нет доступа к id внутри класса модели. есть ли способ, которым я могу попытаться добиться такого же эффекта?

+1

Я не совсем понял вопрос. Вы пытаетесь сказать, что 'id_hash' будет автоматически рассчитан? –

+0

Я хочу, чтобы хэш идентификатора сохранялся прямо рядом с идентификатором в таблице базы данных –

+0

, вы видите, я хочу найти запись для id_hash, и я не хочу искать все объекты для выбора, помещая их все в ram, вместо этого я хочу использовать поиск sql, который возможен только путем добавления хэша в базу данных –

ответ

1

Вы можете переопределить метод save, поскольку id будет автоматически генерируется из базы данных необходимо сохранить по крайней мере дважды -

class pick(models.Model): 
    id_hash = models.TextField(default="") 
    symbol = models.CharField(max_length=5) 
    buy_datetime = models.DateTimeField() 
    buy_price = models.DecimalField(max_digits=8, decimal_places=2) 
    sell_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True) 
    buy_quantity = models.IntegerField() 
    current_price = models.DecimalField(max_digits=8, decimal_places=2) 
    def hash(self): 
     return hashlib.md5(str(self.id)).hexdigest() 
    def __str__(self): 
     return "{} {} {} {} {} {}".format(self.symbol,self.buy_datetime,self.buy_price,self.sell_price,self.buy_quantity, self.current_price) 

    def save(self, *args, **kwargs): 
     with transaction.atomic(): 
      super().save(*args, **kwargs) 
      # for python < 3.0 super(pick, self).save(*args, **kwargs) 
      self.id_hash = self.hash() 
      super().save(*args, **kwargs) 
      # for python < 3.0 super(pick, self).save(*args, **kwargs) 

но есть один другое решение, если требуется только в id_hash для использования с питоном только но не искать с ним в БД, то вам не нужно, чтобы сохранить его, вы можете использовать property для хэш-значения, как это -

@property 
    def id_hash(self): 
     return hashlib.md5(str(self.id)).hexdigest() 
+0

, но для второго варианта я мог бы выполнить поиск по id_hash с той же скоростью и с использованием того же количества бара, что и это я искал id_hashes? –

+0

нет, второй вариант не будет работать для SQL, потому что 'id_hash' - это свойство не db-столбца, поэтому проверка будет выполнена в ram. –

+0

, так что я не смог выполнить поиск по id_hash, используя второй вариант? или я мог бы сделать это только с помощью стандартного цикла питона? –

0

вы хотите переопределить метод создания Ф.О. r модель, так что id_hash записывается после первоначального сохранения. Я предполагаю, что вы не хотите писать id_hash более одного раза. Например, может быть что-то вроде

class PickManager(models.Manager): 
    def create(**kwargs): 
     instance = super(PickManager, self).create(**kwargs) 
     instance.id_hash = hashlib.md5(instance.id).hexdigest() 
     instance.save() 

class Pick(models.Model): 
    id_hash = models.TextField(blank=True) 
    ... 
    objects = PickManager() 

Кроме того, вы должны капитализировать свой номер модели (Pick) и, вероятно, использовать Юникода вместо ул.

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