Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 序列化程序中的Django Rest框架计算?_Python_Django_Python 3.x_Django Rest Framework - Fatal编程技术网

Python 序列化程序中的Django Rest框架计算?

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验证器,从而实现了

我正在使用一个金融应用程序,由于浮点数学的工作方式,我决定将数据库中的所有值存储为美分(因此美元金额*100)。为了让序列化程序为我执行两个计算,我一直在用头撞墙。在创建/更新时,接受浮点值,但在保存到数据库之前,请执行值*100。然后在get上,执行value/100

我使用了一个
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)

自定义序列化程序字段正是我所需要的!非常感谢。自定义序列化程序字段正是我所需要的!非常感谢。