【问题标题】:TypeError: Field 'id' expected a number but got OrderedDictTypeError:字段“id”需要一个数字,但得到了 OrderedDict
【发布时间】:2021-02-12 04:40:39
【问题描述】:

我想发布请求 django rest 但是这个错误。我有两个序列化程序。我想发布一个不通过 id 的完整数据请求

Exception Value:    
Field 'id' expected a number but got OrderedDict([('title', 'id:2 Смартфон Samsung Galaxy Note 20 Ultra 256GB Black'), ('price', 2019)]).  



 class ShopSerializer(serializers.ModelSerializer):
        img1 = serializers.SerializerMethodField('get_image_url')
        img2 = serializers.SerializerMethodField('get_image_url')
        img3 = serializers.SerializerMethodField('get_image_url')
        img4 = serializers.SerializerMethodField('get_image_url')
        img5 = serializers.SerializerMethodField('get_image_url')
        img6 = serializers.SerializerMethodField('get_image_url')
        class Meta:
            model = smartphone
            fields = ("id", "img1", "img2", "img3", "img4", "img5", "img6","title","price","slug")
        def get_image_url(self, obj):
            return obj.image.url
        
        
  class OrderCreateSerializer(serializers.ModelSerializer):
        smartphone=ShopSerializer(many=True)
        class Meta:
            model = order
            fields = '__all__'
    
        def create(self, validated_data):
            
            smartphone = validated_data.pop('smartphone')
            question = order.objects.create(**validated_data)
            question.smartphone.set(smartphone)
            return question

怎么解决这个问题怎么解决这个问题怎么解决这个问题怎么解决这个问题

观看次数

class OrderCreateView(generics.CreateAPIView):
    queryset = order.objects.all()
    serializer_class = OrderCreateSerializer

【问题讨论】:

  • 请添加您的views.py。你跑python manage.py makemigrationspython manage.py migrate了吗?
  • @MichaelH 添加了视图
  • 观看次数看起来​​不错。您在 github 上是否有示例项目,或者您也可以提供模型文件吗?

标签: python django django-rest-framework


【解决方案1】:

请尝试以下发帖请求:

{
    "smartphone": [{
        "id": 2,
        "img1": "/media/photos/498f6387e90cfee88f98c4379b0d2057ec3623ee_228615_1_qhhauLD.jpg",
        "img2": "/media/photos/aaf2ece82f9b4d357c78c3bac9eb61e4b6a5dc0e_228615_3_K7RDb8Z.jpg",
        "img3": "/media/photos/00d7a263681301aa35d9dad51cf7d0859965bc5c_228615_2_jBLEZqi.jpg",
        "img4": "/media/photos/498f6387e90cfee88f98c4379b0d2057ec3623ee_228615_1_M9GV72N.jpg",
        "img5": "/media/photos/fe49e462ef4847ac6296d4bba6cd4ab35d374daf_228615_5_CgYDohH.jpg",
        "img6": "/media/photos/b036713f6015464a366dbc1890f0b66041015f64_227736_1_1yAxj5T.jpg",
        "price": 2019,

        "slug": "id2-samsung-galaxy-note-20-ultra-256gb-black",
        "title": "id:2 Смартфон Samsung Galaxy Note 20 Ultra 256GB Black"
    }],
    "orderCustomer": 6,
    "orderAddress": 5
}

更新:

还要确保此行按预期工作 question.smartphone.set(smartphone).

smartphones = validated_data.pop('smartphone')
smartphone_models = []
for sm in smartphones:
    print("value of sm is: {}".format(sm))
    print("type of sm is: {}".format(type(sm)))
    new_smartphone = smartphone.objects.create(sm)
    new_smartphone.save()
    smartphone_models.append(new_smartphone)
question = order.objects.create(**validated_data)
print(smartphone_models)
question.smartphone.set(smartphone_models)

【讨论】:

  • 'collections.OrderedDict' object has no attribute 'objects' 这样的错误就出来了
  • @AsylkhanMustafa 对不起我的错。我更新了答案
  • 请注意 post 请求中添加的花括号
  • create () 接受 1 个位置参数,但给定了 2 个错误
  • 如果在此行之前添加print(sm),输出是什么
【解决方案2】:
{
    "smartphone": [
"id": 2
"img1": "/media/photos/498f6387e90cfee88f98c4379b0d2057ec3623ee_228615_1_qhhauLD.jpg"
"img2": "/media/photos/aaf2ece82f9b4d357c78c3bac9eb61e4b6a5dc0e_228615_3_K7RDb8Z.jpg"
"img3": "/media/photos/00d7a263681301aa35d9dad51cf7d0859965bc5c_228615_2_jBLEZqi.jpg"
"img4": "/media/photos/498f6387e90cfee88f98c4379b0d2057ec3623ee_228615_1_M9GV72N.jpg"
"img5": "/media/photos/fe49e462ef4847ac6296d4bba6cd4ab35d374daf_228615_5_CgYDohH.jpg"
"img6": "/media/photos/b036713f6015464a366dbc1890f0b66041015f64_227736_1_1yAxj5T.jpg"
"price": 2019

"slug": "id2-samsung-galaxy-note-20-ultra-256gb-black"
"title": "id:2 Смартфон Samsung Galaxy Note 20 Ultra 256GB Black"
],
    "orderCustomer": 6,
    "orderAddress": 5
}

我的帖子请求看起来像这样

【讨论】:

  • 为什么智能手机列表中没有分号?
  • @MichaelH 是的,我刚刚忘记了
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2021-06-03
  • 2021-01-22
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多