[英]Django AttributeError: 'collections.OrderedDict' object has no attribute 'pk'
[英]Django - AttributeError: 'collections.OrderedDict' object has no attribute 'id'
api 調用以某種方式忽略了與容器對象一起發送的 id。 它為我提供了兩個容器的 id 的空值。
當我嘗試以任何方式檢查 id 時,例如print(container.get("id")
,它會給我該屬性錯誤。我可能做錯了什么?
這是序列化程序:
class GoodsInSerializer(serializers.ModelSerializer):
containers = ContainerSerializer(required=True, many=True)
class Meta:
model = GoodsIn
fields = (
'id', 'name', 'warehouse', 'containers', )
read_only_fields = ('id',)
def update(self, instance, validated_data):
goodsin_obj = GoodsIn.objects.get(id=instance.id)
warehouse = validated_data.get('warehouse')
containers = None
if 'containers' in validated_data:
containers = validated_data.pop('containers')
if containers:
print(containers)
keep_container = []
container_list = [
container for container in Container.objects.filter(goods_in=goodsin_obj)]
for container in containers:
# the id does not reach the ordered dictionary
if container.get('id'):
container_obj = Container.objects.get(
id=container.get('id'))
else:
container_obj = Container.objects.create(**container)
container_obj.checked_in = False
container_obj.warehouse_id = warehouse
container_obj.goods_in = goodsin_obj
container_obj.save()
keep_container.append(container_obj)
for container in container_list:
if container not in keep_container:
container.delete()
這是我發送給 api 調用的數據:
{
"warehouse":"warehouse1",
"containers":[{
"id":"332131",
"product": "pencil",
"quantity": 33,
"grade": "Grade B",
"checked_in": true
},{
"id":"122331",
"product": "xyz",
"quantity": 101,
"grade": "Grade B",
"checked_in": false
}]
}
發生這種情況是因為您已將id
設置為序列化程序中的只讀字段。 你的序列化器的Meta
類應該是這樣的:
class GoodsInSerializer(serializers.ModelSerializer):
containers = ContainerSerializer(required=True, many=True)
class Meta:
model = GoodsIn
fields = ('id', 'name', 'warehouse', 'containers', )
# your update method here
這解決了它:
相關模型 ID 在 validated_data 中丟失,即使它存在於請求中
我需要將以下內容添加到我的ContainerSerializer
中:
id = serializers.IntegerField(required=False)
有人可能會出現並向我展示更好的方法,所以我不確定這是否是正確的方法,但它確實有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.