У меня есть модель, которая принимает 3 целых числа как часть своих полей

class TradeBill(models.Model):
    ......
    first = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(2)])
    second = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(2)])
    third = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(2)])
    .....

Мне нужно еще одно положительное целочисленное поле под названием score, которое складывает значения трех других. В настоящее время у меня есть только это и, таким образом, я забочусь об этом во внешнем интерфейсе:

score = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(6)])

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

1
Saif eldeen Adel 11 Фев 2021 в 14:09

1 ответ

Лучший ответ

Вам не нужно создавать дополнительное поле для score, вместо этого вы можете сделать score свойством своей модели

class TradeBill(models.Model):
    ...
    @property
    def score(self):
           return self.first + self.second + self.third
    ...

ИЗМЕНИТЬ Расширение ответа, чтобы включить сериализатор. Вы также можете включить свойство модели в сериализатор

class TradeBillSerializer(serializers.ModelSerializer):
       class Meta:
           fields = ("score", ...)

Кроме того, вы можете использовать SerializerMethodField (как упоминалось в комментариях @Saif eldeen Adel.

class TradeBillSerializer(serializers.ModelSerializer):
       
     score = serializers.SerializerMethodField()

     def get_score(self, obj):
         return obj.score

     class Meta:
           fields = ("score", ...)

SerializerMethodField обеспечивает гибкость для выполнения обработки или форматирования поля.

2
VJ Magar 11 Фев 2021 в 13:02