python - Django MoneyField:MoneyField 的值无效
问题描述
我在 Django 中使用 MoneyField 时遇到了一点问题。
我有 2 个模型:Work
和Price
. 并作为外键Price
获取。Work id
在 Postman 中,我试图Work
用 a 发布 a Price
,但我不断收到错误消息。
这是我的work_model
:
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Work(models.Model):
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
name = models.CharField(max_length=200)
length = models.IntegerField(null=True)
width = models.IntegerField(null=True)
def __str__(self):
return "{}".format(self.name)
在这里我的price_model
from django.db import models
from .model_work import *
from djmoney.models.fields import MoneyField
class Price(models.Model):
work = models.OneToOneField(Work, on_delete=models.CASCADE, related_name='price')
price = MoneyField(max_digits=19, decimal_places=4, default_currency='USD', null=True)
shipping = models.IntegerField(null=True)
total = models.IntegerField(null=True)
def __str__(self):
return "{}".format(self.price)
当我Work
在邮递员中发布时:
{
"user":"2",
"name":"work 20",
"price":
[
{
"price":20,
"price_currency":"USD",
"shipping":12,
"total":32
}
],
"length":"50",
"width":"60"
}
我不断收到此错误:
ValidationError at /works/
["Invalid value for MoneyField: [OrderedDict([('price', <Money: 20.0000 USD>), ('shipping', 12), ('total', 32)])]."]
我到处寻找,但无法理解我的错误,有人知道吗?
感谢您的回复!
更新 1:忘记放serializers
.
这是我的work_serializer
:
from rest_framework import serializers
from ..models.model_work import Work
from .serializers_user import *
from .serializers_price import *
class WorkIndexSerializer(serializers.ModelSerializer):
"""
Serializer listing all Works models from DB
"""
user = UserIndexSerializer()
price_set = PriceDetailsSerializer(many=True)
class Meta:
model = Work
fields = [
'id',
'name',
'price_set',
'length',
'width',
]
class WorkCreateSerializer(serializers.ModelSerializer):
"""
Serializer to create a new Works model in DB
"""
price = PriceCreateSerializer(many=True)
class Meta:
model = Work
fields = [
'user',
'name',
'price',
'length',
'width',
]
def create(self, validated_data):
price = Price.objects.create(**validated_data)
work = Work.objects.create(**validated_data)
return work
class WorkDetailsSerializer(serializers.ModelSerializer):
"""
Serializer showing details of a Work model from DB
"""
user = UserIndexSerializer()
class Meta:
model = Work
fields = fields = [
'user',
'name',
'price_set',
'length',
'width',
]
我的price_serializer
:
from rest_framework import serializers
from ..models.model_price import Price
class PriceIndexSerializer(serializers.ModelSerializer):
"""
Serializer showing Price information when called by Work GET serializers.
Not showing 'work' field to avoid loop.
"""
class Meta:
model = Price
fields = [
'price',
'shipping',
'total'
]
depth = 1
class PriceDetailsSerializer(serializers.ModelSerializer):
"""
Serializer showing Price information when called by Work GET serializers.
Not showing 'work' field to avoid loop.
"""
class Meta:
model = Price
fields = [
'price',
'shipping',
'total'
]
depth = 1
class PriceCreateSerializer(serializers.ModelSerializer):
"""
Serializer to create a new Price when new Work model is created in DB
"""
class Meta:
model = Price
fields = [
'price',
'shipping',
'total'
]
def create(self, validated_data):
work = Work.objects.create(**validated_data)
return work
解决方案
推荐阅读
- swift - 从异步 NSOpenPanel 返回
- vue.js - Vuex 4 + Vue 3 在模块中使用共享状态操作
- java - 有没有办法找到 soot.jimple.spark.pag.Node 实例的定义位置(例如它所属的 SootMethod)?
- python - 敌人武器 y Pos 攻击 Pygame 如何修复?
- c# - 从服务器 C# 下载 Excel 文件
- html - ShinyDashboard 仪表板标题与浏览器中的徽标不符
- sql - report records are in multiple systems
- python - 使用线程同时写入多个 CSV 文件
- ruby-on-rails - 首次使用序列化 json 列访问模型时出现致命错误
- sass - How to add text to the image slider (carusel) sass/html (react)