django - Django Rest Framework 使用 ChoiceField 读/写 ModelSerializer
问题描述
我的模型“OrderItem”中有几个字段是 ChoiceFields 或 Enums。我想代表选择的标签并使用serializers.CharField(source='get_service_display')
. 另请参阅带有 ChoiceField 的 Django Rest 框架。
这工作正常,但创建对象不再工作,并出现以下错误消息OrderItem() got an unexpected keyword argument 'get_service_display'
这是我的模型
class OrderItem(TimeStampedModel):
class Categories(models.IntegerChoices):
GRASS = (1, _('grass'))
order = models.ForeignKey(Order, related_name='order_items', on_delete=models.CASCADE)
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
category = models.IntegerField(choices=Categories.choices)
这里是我的序列化程序
class OrderItemSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
category = serializers.CharField(source='get_category_display')
class Meta:
model = OrderItem
fields = ['id', 'unit_price', 'category']
read_only_fields = ['unit_price']
我怎样才能创建这样的模型?
解决方案
尝试这个:
from rest_framework import fields
from your_app_path.models import Categories
class OrderItemSerializer(serializers.ModelSerializer):
category = fields.ChoiceField(Categories.choices)
另一个注意事项。我不熟悉仅用于选择的子分类模型。我通常这样做:
class OrderItem(TimeStampedModel):
GRASS = 'grass'
CATEGORY_CHOICES = (
(1, _(GRASS)),
)
order = models.ForeignKey(Order, related_name='order_items', on_delete=models.CASCADE)
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
category = models.IntegerField(choices=CATEGORY_CHOICES)
推荐阅读
- javascript - 使用 WebAudio API 从 getChannelData 方法获取麦克风 PCM 数据不起作用
- java - Selenium sendKeys 未停留在预期元素中
- python - Pyspark:将 CSV 转换为嵌套 JSON
- amazon-s3 - 尽管通过 aws "s3 cp s3" 检索成功,但 AWS::CloudFormation::Init 无法从 S3 Bucket 创建文件
- saml - SAML 2.0 属性语句是否有大小限制?
- c++ - 如何将向量的数据传递给 CUDA 内核?
- sql-server - SQL CASE 表达式没有在 3 列中选择最大值,MAX 也不是
- java - 如何将 Liferay 6.2 portlet 升级到 Liferay 7.2
- spring - 带有谷歌扳手的春季批处理,没有内存数据库
- regex - 在 ReactJS 中的 axios 中模拟 url 中的数字