Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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框架中公开MoneyFields?_Python_Django_Django Rest Framework - Fatal编程技术网

Python 在Django REST框架中公开MoneyFields?

Python 在Django REST框架中公开MoneyFields?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一些Django模型使用djmoney.models.fields.MoneyField。它存储的数据类似于“US$1000.00” 我试图通过API直接在Django的admin中使用自定义视图公开此内容,如: from rest_framework import generics from rest_framework import serializers class MyModelAdmin(admin.ModelAdmin): def changelist_view_ap

我有一些Django模型使用
djmoney.models.fields.MoneyField
。它存储的数据类似于“US$1000.00”

我试图通过API直接在Django的admin中使用自定义视图公开此内容,如:

from rest_framework import generics
from rest_framework import serializers

class MyModelAdmin(admin.ModelAdmin):

    def changelist_view_api(self, request, extra_context=None):

        cl = self.get_changelist_instance(request)
        base_queryset = cl.get_queryset(request)

        fieldsets = self.get_fieldsets(request)

        class ModelSerializer(serializers.ModelSerializer):

            class Meta:
                model = self.model
                fields = all_fields

        class ModelAdminListAPI(generics.ListCreateAPIView):
            queryset = base_queryset
            serializer_class = ModelSerializer

            name = '%s List API' % self.model._meta.verbose_name.title()

            def get(self, request, *args, **kwargs):
                return self.list(request, *args, **kwargs)

        view_handler = ModelAdminListAPI.as_view(queryset=base_queryset, serializer_class=ModelSerializer)
        return view_handler(request, extra_context, format=_format)
这很有效,唯一的例外是它会阻塞这些特殊的MoneyField实例。如果字段列表中有其中一个字段,此视图将返回异常:

  File "~/.env/lib/python3.7/site-packages/rest_framework/mixins.py", line 43, in list
    return self.get_paginated_response(serializer.data)
  File "~/.env/lib/python3.7/site-packages/rest_framework/serializers.py", line 761, in data
    ret = super().data
  File "~/.env/lib/python3.7/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "~/.env/lib/python3.7/site-packages/rest_framework/serializers.py", line 679, in to_representation
    self.child.to_representation(item) for item in iterable
  File "~/.env/lib/python3.7/site-packages/rest_framework/serializers.py", line 679, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "~/.env/lib/python3.7/site-packages/rest_framework/serializers.py", line 530, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "~/.env/lib/python3.7/site-packages/rest_framework/fields.py", line 1148, in to_representation
    value = decimal.Decimal(str(value).strip())
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
文件“~/.env/lib/python3.7/site packages/rest\u framework/mixins.py”,列表第43行
返回self.get_分页的_响应(serializer.data)
数据中的文件“~/.env/lib/python3.7/site packages/rest\u framework/serializers.py”,第761行
ret=super().data
数据中的文件“~/.env/lib/python3.7/site packages/rest\u framework/serializers.py”,第260行
self.\u data=self.to\u表示(self.instance)
文件“~/.env/lib/python3.7/site packages/rest\u framework/serializers.py”,第679行,以to\u表示
iterable中项的self.child.to_表示(项)
文件“~/.env/lib/python3.7/site packages/rest\u framework/serializers.py”,第679行,在
iterable中项的self.child.to_表示(项)
文件“~/.env/lib/python3.7/site packages/rest\u framework/serializers.py”,第530行,以to\u表示
ret[field.field\u name]=field.to\u表示(属性)
文件“~/.env/lib/python3.7/site packages/rest\u framework/fields.py”,第1148行,以to\u表示
value=decimal.decimal(str(value).strip())
decimal.invalidooperation:[]
深入研究DRF的内部,它似乎将MoneyField视为DecimalField,因为这是它的继承。但是,djmoney还创建了另一个名为
*\u currency
的字符域,用于存储货币面额(例如“USD”)。然后,当您请求money字段的逻辑值时,它将十进制值和货币值合并为“”格式

我认为DRF遇到了一个问题,它试图将这个值解释为十进制


这是DRF中的一个bug还是我配置错误了?如何允许DRF正确解释MoneyField值?

我遇到了同样的问题,通过将
'djmoney',
添加到
已安装的应用程序中解决了这个问题。执行此操作时,
MoneyField
将为转换和所有工作注入正确的序列化程序字段。HTH:-)