Создание хэша данных в сериализаторах django rest framework
я хочу сделать SHA256 хэш некоторых полей в моем сериализаторе и установить его в другое поле в том же сериализаторе, вот моя модель:
class Something(models.Model):
x = models.CharField(max_length=300)
y = models.IntegerField()
z = models.IntegerField()
f = models.IntegerField()
hash = models.CharField(max_length=300)
сначала пользователь определяет x, y, z и f. После этого мне нужно автоматически сгенерировать хэш следующим образом hash = x + y + z + f
мой сериализатор :
class SomethingSerializers(serializers.ModelSerializer):
class Meta:
model = Something
fields = ['x', 'y', 'z', 'f', 'hash']
какое решение будет лучшим?
Вы можете добавить свойство модели, вычисляющее ваш хэш:
class Something(models.Model):
x = models.CharField(max_length=300)
y = models.IntegerField()
z = models.IntegerField()
f = models.IntegerField()
@property
def hash(self):
return your_hashed_value
Просто переопределите метод сохранения модели следующим образом:
import hashlib
class Something(models.Model):
x = models.CharField(max_length=300)
y = models.IntegerField()
z = models.IntegerField()
f = models.IntegerField()
hash = models.CharField(max_length=300)
def save(self, *args, **kwargs):
input = self.x + str(self.y) + str(self.z) + str(self.f)
result = hashlib.sha256(input.encode())
self.hash = result.hexdigest()
super(Something, self).save(*args, **kwargs)
И сериализаторы в порядке.
Вы можете добавить SerializerMethodField
, который хэширует эти значения:
class SomethingSerializers(serializers.ModelSerializer):
hash = serializers.SerializerMethodField()
class Meta:
model = Something
fields = ['x', 'y', 'z', 'f', 'hash']
def get_hash(self, obj):
return obj.x + obj.y + obj.z + obj.f # or your custom logic
Обратите внимание, что это не сохранит хэш в db