Python Django Rest Framework:尝试获取序列化程序OrderCreateSerializer上的字段“data_params”的值时,获取了AttributeError`
这是我的模型:Python Django Rest Framework:尝试获取序列化程序OrderCreateSerializer上的字段“data_params”的值时,获取了AttributeError`,python,django,django-rest-framework,Python,Django,Django Rest Framework,这是我的模型: class Order(models.Model): """ 订单 """ order_num = models.CharField(max_length=128, unique=True) # 订单编号 order_status = models.CharField(max_length=12) # 订单状态 "未支付", "已支付,未完成", "已完成", "已经删除","其他" product_describe = mo
class Order(models.Model):
"""
订单
"""
order_num = models.CharField(max_length=128, unique=True) # 订单编号
order_status = models.CharField(max_length=12) # 订单状态 "未支付", "已支付,未完成", "已完成", "已经删除","其他"
product_describe = models.TextField() # 产品描述
billing_type = models.CharField(max_length=16) # 计费类型
buytime = models.CharField(max_length=16) # 比如:1月 永久
count = models.IntegerField() # 购买数量
paytype = models.CharField(max_length=16) # 支付方式(支付包,微信,xxx)
cost = models.DecimalField(max_digits=8, decimal_places=2, default=0.00) # 费用(需要花费多少钱)
account = models.ForeignKey(to=Account) # 所属账户
ctime = models.DateTimeField(auto_now_add=True) # 创建时间
uptime = models.DateTimeField(auto_now=True) # 更新时间
def __str__(self):
return self.product_describe
def __unicode__(self):
return self.product_describe
这是我的序列化程序:
class OrderCreateSerializer(ModelSerializer):
data_params = serializers.DictField() # 根据产品数据模型不同而异
class Meta:
model = Order
fields = (
"product_describe", # 产品描述 (购买xx产品 + 参数)
"billing_type", # 计费类型 ("包年包月")
# "buytime", # "购买时间"
# "count", # 数量
# "paytype", # 支付方式
"data_params", # 数据
)
def create(self, validated_data):
request = self.context.get("request")
if request and hasattr(request, "user"):
user = request.user
validated_data["order_num"] = generateOrderNum(userid=user.id)
validated_data["order_status"] = "未支付"
data_dic = validated_data.pop("data_params") #
validated_data["buytime"] = data_dic["data"]["buytime"]
validated_data["count"] = data_dic["data"]["count"]
validated_data["paytype"] = "" # 支付类型
validated_data["cost"] = 0.00 # 所需钱
validated_data["account"] = user.account # 是哪个账户
return Order.objects.create(**validated_data)
你看,在我的序列化程序中,我弹出了数据参数
:
data_dic = validated_data.pop("data_params")
但当我访问此API时,我得到:
属性错误位于/api/financialmanage/order/add/试图获取序列化程序
OrderCreateSerializer
上的字段data\u params
的值时,获取了AttributeError
序列化程序字段的名称可能不正确,并且与Order
实例上的任何属性或键都不匹配。原始异常文本为:“订单”对象没有属性“数据参数” 如果我不弹出
数据参数
,我将得到以下错误:
在/api/FinancialManager/order/add/“data_params”是此函数的无效关键字参数
编辑 My views.py:
class OrderSerializerCreateAPIView(CreateAPIView):
"""
create Order
"""
serializer_class = OrderCreateSerializer
permission_classes = []
queryset = Order.objects.all()
编辑-2 在我的情况下,
数据参数
字典对我来说是必要的。
因为当我购买一个产品(如CloudServer)时,它有count、vCPU、ram、磁盘和带宽,我通过data\u params
来获得它
您可能想知道为什么我必须使用
data\u params
来接收数据,因为产品可能不同,如果产品是Wine,它现在就不能具有vcpus属性 如果要在数据参数参数不是模型中的字段时将其添加到序列化程序中,则应使用DRF的def to_representation
函数。应该是这样的:
class OrderCreateSerializer(ModelSerializer):
data_params = DictField(child=serializers.CharField())
.
.
.
def create(self, validated_data):
print(validated_data)
data_dic = validated_data.pop("data_params")
print(data_dic)
return super(OrderCreateSerializer, self).create(validated_data)
class OrderSerializer(ModelSerializer):
class Meta:
model = Order
fields = '__all__'
# by @Vasil Shtiliyanov if you want return data_parms after create
def to_representation(self, instance):
serialized_data = super(OrderSerializer, self).to_representation(instance)
serialized_data['data-params'] = #logic goes here
return serialized_data
class OrderSerializerCreateAPIView(CreateAPIView):
"""
create Order
"""
serializer_class = OrderCreateSerializer
permission_classes = []
queryset = Order.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
instance = self.perform_create(serializer)
data = OrderSerializer(instance).data
headers = self.get_success_headers(data )
return Response(data , status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
return serializer.save()
def to_representation(self, instance):
serialized_data = super(SerializerClass, self).to_representation(instance)
serialized_data['data-params'] = #logic goes here
return serialized_data
并从Meta类的fields参数中删除数据参数。我将其解析为与您的相同:
data_params = serializers.DictField() # yours
data_params = serializers.DictField(write_only=True) # try it, pls.
源代码:
# rest_framework/serializers.py => L504
def to_representation():.
..
fields = self._readable_fields # this function rest_framework/serializers.py=>L371
...
请您用相关视图更新您的问题。py?我在模型
订单中看不到数据参数
@ABDULNIYASPM查看我的EIDT。@anuragal是的,模型订单没有数据参数
,当我创建订单时,我会弹出它。但是有一个问题。只需从“class Meta”的“fields”中删除数据参数,然后删除pop语句。其余的应该很好。您得到TypeError,因为订单不希望在creation语句中出现“data_params”参数。在类Meta:
中,字段中的data_params是否减少了retract?如果我从元类的fields参数中删除数据参数。
将报告错误。逻辑在这里的含义是什么?
?它意味着在那里你说字段数据参数的值是什么。初始错误表示数据参数不是模型中的字段,因此不应将其包含在元类的fields参数中。您已经标记了答案。看来我的评论无关紧要。为我工作,谢谢