Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 已验证的\u数据在.create():嵌套序列化程序中验证的POST请求期间删除某些字段_Python_Django_Django Rest Framework - Fatal编程技术网

Python 已验证的\u数据在.create():嵌套序列化程序中验证的POST请求期间删除某些字段

Python 已验证的\u数据在.create():嵌套序列化程序中验证的POST请求期间删除某些字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,:已购买的产品=已验证的数据。pop(“产品”)键错误:“产品” 我在产品和购买之间有M2M关系。我试图实现的是,当进行购买时,还要填充PurchasedProduct(直通模型)模型。但每次我将数据发送到API,并尝试从已验证的\u数据访问序列化程序中的产品密钥时,都会引发keyError异常,但如果为了调试产品而返回已验证的\u数据,则密钥是响应的一部分 djangorestframework==3.11.0 django==2.2.10 类别产品(型号): name=CharField(最

:已购买的产品=已验证的数据。pop(“产品”)键错误:“产品”

我在产品和购买之间有M2M关系。我试图实现的是,当进行购买时,还要填充PurchasedProduct(直通模型)模型。但每次我将数据发送到API,并尝试从已验证的\u数据访问序列化程序中的
产品
密钥时,都会引发keyError异常,但如果为了调试
产品
而返回已验证的\u数据,则密钥是响应的一部分

djangorestframework==3.11.0
django==2.2.10

类别产品(型号):
name=CharField(最大长度=20,唯一性=True)
添加日期=日期时间字段(默认值=现在)
models.py

类购买(型号):
manager=ForeignKey('users.User',on\u delete=PROTECT,related\u name='purchases')
数量=小数字段(最大位数=6,小数位数=2)
products=ManyToManyField('branchs.Product',通过='PurchasedProduct',在,
通过_字段=('purchase','product'))
金额=整数字段(默认值为0)
金额\美元=整数字段(默认值=0)
总金额=整数字段(默认值为0)
购买日期=日期时间字段(默认值=现在)
类别PurchasedProduct(型号):
purchase=ForeignKey('purchase',on_delete=CASCADE,related_name=“to_products”,blank=True)
product=ForeignKey('branchs.product',on_delete=CASCADE,related_name='purchases')
单价=DecimalField(最大位数=12,小数位数=4,默认值=0.00)
数量=小数字段(最大位数=5,小数位数=2)
金额=小数字段(最大位数=10,小数位数=2)
购买日期=日期时间字段(默认值=现在)
序列化程序.py

类PurchasedProductSerializer(ModelSerializer):
类元:
型号=购买的产品
字段=[
“身份证”,
“购买”,
“产品”,
“单价”,
“数量”,
“金额”,
“购买日期”
]
类PurchaseSerializer(ModelSerializer):
# https://github.com/encode/django-rest-framework/issues/5403
products=PurchasedProductSerializer(source=“to_products”,many=True)
类元:
型号=购买
字段=[
“身份证”,
“经理”,
“数量”,
“金额”,
“金额(美元)”,
“总金额”,
“产品”,
“购买日期”
]
def创建(自我验证的_数据):
购买的产品=已验证的数据.pop(“产品”)
manager=validated\u data.pop('manager'))
数量=已验证的\u数据.pop('数量')
amount\u fc=已验证的\u data.pop('amount\u fc')
amount\u usd=已验证的\u data.pop('amount\u usd')
合计金额=已验证的金额数据.pop('合计金额')
purchase=purchase.objects.create(
经理,
数量=数量,
金额=金额,
金额=金额,
总金额=总金额
)
对于已采购产品中的已采购产品:
product=product.objects.get(pk=purchased\u product.pop(“产品”))
purchase.products.add(产品,通过默认值=已购买的产品)
退货
view.py

class PurchasesListView(ListCreateAPIView):
queryset=Purchase.objects.all()
serializer\u class=PurchaseSerializer
权限\类=[AllowAny]
filterset_字段=[“购买日期”,“经理”]
资料

{
“金额”:13303340.0,
“金额:1500美元”,
“经理”:2,
“数量”:100,
“总金额”:1230945,
“产品”:[
{
“金额”:1200334,
“产品”:8,
“数量”:120,
“单价”:10003.34
},
{
“金额”:1600334,
“产品”:6,
“数量”:100,
“单价”:16003.34
}
]
}
错误:

purchased\u products=validated\u data.pop(“products”)键错误:“products”

但是当我将
purchased\u products=validated\u data.pop(“products”)
更改为
purchased\u products=validated\u data.pop(“products”,[])
时,它可以工作,但不能填充整个模型(PurchasedProduct)

我尝试过的

DRF示例

可写嵌套 不支持带有直通型号的M2M

消除源
products=PurchasedProductSerializer(many=True)
添加了
write\u only=True
read\u only=False
。我也尝试过在产品模型上抑制uniqueValidator,但仍然不起作用。

经过一点谷歌搜索加上一些尝试和错误。我找到了两种解决这个问题的方法

  • 第一种方法是直接从
    self.context
    获取密钥
  • purchased_products=self.context['request'].data['products']
    
    而且效果很好。但是我仍然不明白为什么当试图从
    验证的数据
    中获取
    产品
    时会抛出
    KeyError

  • 第二种选择是使用。 向团队大声呼喊。为什么要使用
    pop()
    ?但是,即使您使用的是
    get()
    如果
    validate\u数据(“产品”)
    不存在,您也会得到
    None
    。即使是
    .get()
    也无法工作。由于某些原因,当我发出
    POST
    请求时,它没有包含在已验证的_数据中,但是
    GET
    工作正常