簡體   English   中英

Django - AttributeError: 'collections.OrderedDict' 對象沒有屬性 'id'

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM