Python 序列化程序中的Django Rest框架计算?
我正在使用一个金融应用程序,由于浮点数学的工作方式,我决定将数据库中的所有值存储为美分(因此美元金额*100)。为了让序列化程序为我执行两个计算,我一直在用头撞墙。在创建/更新时,接受浮点值,但在保存到数据库之前,请执行值*100。然后在get上,执行value/100 我使用了一个Python 序列化程序中的Django Rest框架计算?,python,django,python-3.x,django-rest-framework,Python,Django,Python 3.x,Django Rest Framework,我正在使用一个金融应用程序,由于浮点数学的工作方式,我决定将数据库中的所有值存储为美分(因此美元金额*100)。为了让序列化程序为我执行两个计算,我一直在用头撞墙。在创建/更新时,接受浮点值,但在保存到数据库之前,请执行值*100。然后在get上,执行value/100 我使用了一个SerializerMethodField,使它工作了一半,但这似乎使我无法执行创建/更新操作。我还曾在视图中更改了serializer.save()方法,并在该字段上添加了IntegerField验证器,从而实现了
SerializerMethodField
,使它工作了一半,但这似乎使我无法执行创建/更新操作。我还曾在视图中更改了serializer.save()
方法,并在该字段上添加了IntegerField
验证器,从而实现了创建/更新,但这破坏了SerializerMethodField
简言之,我被困住了。哈哈
这是我非常简单的模型:
class Items(models.Model):
user = models.ForeignKey(
'CustomUser',
on_delete=models.CASCADE,
)
name = models.CharField(max_length=60)
total = models.IntegerField()
我对这一项目的看法:
class GetItems(generics.ListCreateAPIView):
serializer_class = ItemsSerializer
permission_classes = [permissions.IsAuthenticated, IsAuthorOrDenied]
user = serializers.HiddenField(default=serializers.CurrentUserDefault(), )
def get_queryset(self):
user = self.request.user
return Items.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
class SingleItem(generics.RetrieveUpdateDestroyAPIView):
serializer_class = ItemsSerializer
permission_classes = [permissions.IsAuthenticated, IsAuthorOrDenied]
user = serializers.HiddenField(default=serializers.CurrentUserDefault(), )
def get_queryset(self):
user = self.request.user
return Items.objects.filter(user=user)
def perform_update(self, serializer):
serializer.save(user=self.request.user)
还有我的序列化程序
class ItemsSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'name', 'budget_total')
model = models.Items
我觉得我应该在序列化程序中做得更多,而在视图中做得更少,但这可能是一个完全不同的问题
提前感谢您的帮助 自定义序列化程序字段
您可以编写以下代码来处理数据:
class BudgetField(serializers.Field):
def to_representation(self, value):
# You can decide here how you want to return your data back
return value / 100
def to_internal_value(self, data):
# this will be passed to validated_data, so will be used to create/update instances
# you could do some validation here to make sure it is a float
# https://www.django-rest-framework.org/api-guide/fields/#raising-validation-errors
return int(data * 100)
然后在序列化程序上使用自定义字段
class ItemsSerializer(serializers.ModelSerializer):
total = BudgetField()
class Meta:
fields = ('id', 'name', 'total')
model = models.Items
class ItemsSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'name', 'budget_total')
model = models.Items
def create(self, validated_data):
# Modify validated_data with the value you need
return super().create(validated_data)
def update(self, instance, validated_data):
# Modify validated_data with the value you need
return super().update(instance, validated_data)
覆盖.update()
和.create()
您还可以选择在序列化程序上重写这些方法
class ItemsSerializer(serializers.ModelSerializer):
total = BudgetField()
class Meta:
fields = ('id', 'name', 'total')
model = models.Items
class ItemsSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'name', 'budget_total')
model = models.Items
def create(self, validated_data):
# Modify validated_data with the value you need
return super().create(validated_data)
def update(self, instance, validated_data):
# Modify validated_data with the value you need
return super().update(instance, validated_data)
自定义序列化程序字段
您可以编写以下代码来处理数据:
class BudgetField(serializers.Field):
def to_representation(self, value):
# You can decide here how you want to return your data back
return value / 100
def to_internal_value(self, data):
# this will be passed to validated_data, so will be used to create/update instances
# you could do some validation here to make sure it is a float
# https://www.django-rest-framework.org/api-guide/fields/#raising-validation-errors
return int(data * 100)
然后在序列化程序上使用自定义字段
class ItemsSerializer(serializers.ModelSerializer):
total = BudgetField()
class Meta:
fields = ('id', 'name', 'total')
model = models.Items
class ItemsSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'name', 'budget_total')
model = models.Items
def create(self, validated_data):
# Modify validated_data with the value you need
return super().create(validated_data)
def update(self, instance, validated_data):
# Modify validated_data with the value you need
return super().update(instance, validated_data)
覆盖.update()
和.create()
您还可以选择在序列化程序上重写这些方法
class ItemsSerializer(serializers.ModelSerializer):
total = BudgetField()
class Meta:
fields = ('id', 'name', 'total')
model = models.Items
class ItemsSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id', 'name', 'budget_total')
model = models.Items
def create(self, validated_data):
# Modify validated_data with the value you need
return super().create(validated_data)
def update(self, instance, validated_data):
# Modify validated_data with the value you need
return super().update(instance, validated_data)
自定义序列化程序字段正是我所需要的!非常感谢。自定义序列化程序字段正是我所需要的!非常感谢。