0

我有Product带字段MoneyField的模型/products/models.py

class Product(SeoModel, ModelWithMetadata, PublishableModel):

    name = models.CharField(max_length=128)

    currency = models.CharField(
        max_length=settings.DEFAULT_CURRENCY_CODE_LENGTH,
        default=settings.DEFAULT_CURRENCY,
    )

    price_amount = models.DecimalField(
        max_digits=settings.DEFAULT_MAX_DIGITS,
        decimal_places=settings.DEFAULT_DECIMAL_PLACES,
    )

    price = MoneyField(amount_field="price_amount", currency_field="currency")

views.py的是:

from .models import Product
from .serializers import ProductListSerializer
from rest_framework import generics

class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductListSerializer

serializers.py

from rest_framework import serializers
from .models import Product


class ProductListSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = ['name', 'id']

当我转到 url 时出现错误:

AttributeError at /ru/products/api/
'MoneyField' object has no attribute 'serialize'
Request Method: GET
Request URL:    http://127.0.0.1:8000/ru/products/api/
Django Version: 2.2.6
Exception Type: AttributeError
Exception Value:    
'MoneyField' object has no attribute 'serialize'

你能帮助我吗?谢谢!

4

1 回答 1

0

DRF 的 ModelSerializer 假定模型中的字段 extend django.db.models.fields.Field,但MoneyField事实并非如此。这是 ModelSerializer 收集字段时的问题:

# rest_framework.utils.model_meta._get_fields
def _get_fields(opts):
    fields = OrderedDict()
    for field in [field for field in opts.fields if field.serialize and not field.remote_field]:
        fields[field.name] = field

    return fields

你可以通过继承 MoneyField 来解决这个问题:

from django_prices.models import MoneyField as BaseMoneyField


class MoneyField(BaseMoneyField):
    serialize = True

这可能会导致您的下一个问题;)

于 2020-07-27T13:43:48.530 回答