Создание хэша данных в сериализаторах 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

Вернуться на верх