** 之后的 Django TypeError get() 参数必须是映射,而不是列表

Django TypeError get() argument after ** must be a mapping, not list

我正在为一个模型创建一个序列化程序,该模型具有引用标签 table.

的 ManyToManyField (tag_id)

serializers.py

class CombinationSerializer(serializers.ModelSerializer):
  # tag_id = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), source='tag', required=False, many=True)
  tag_id = TagWithIdSerializer(many=True, required=False, write_only=False)
  resource_id = serializers.PrimaryKeyRelatedField(queryset=Resource.objects.all(),
                                                   required=True,
                                                   source='resource',
                                                   write_only=False)
  gameround_id = serializers.PrimaryKeyRelatedField(queryset=Gameround.objects.all(),
                                                    required=False,
                                                    source='gameround',
                                                    write_only=False)
  user_id = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all(),
                                               required=False,
                                               source='user',
                                               write_only=False)

  class Meta:
    model = Combination
    depth = 1
    fields = ('id', 'user_id', 'gameround_id', 'resource_id', 'tag_id', 'created', 'score')

  def create(self, validated_data):
    user = None
    request = self.context.get("request")
    if request and hasattr(request, "user"):
      user = request.user

    score = 0

    combination = Combination(
      user=user,
      gameround=validated_data.get("gameround"),
      resource=validated_data.get("resource"),
      created=datetime.now(),
      score=score
    )
    combination.save()

    tag_data = validated_data.pop('tag_id', None)
    if tag_data:
      tag = Tag.objects.get_or_create(**tag_data)[0]
      validated_data['tag_id'] = tag
    
    combination.tag_id.add(validated_data.get("tag_id"))
    return combination

这是有问题的代码:

tag_data = validated_data.pop('tag_id', None)
    if tag_data:
      tag = Tag.objects.get_or_create(**tag_data)[0]
      validated_data['tag_id'] = tag
   
    combination.tag_id.add(validated_data.get("tag_id"))

这是我要在 Postman 中发送的 JSON 对象:

{
        "gameround_id": 2015685170,
        "resource_id": 327888,
        "tag_id": [{"id": 2001372884, "name": "combination", "language": "en"}]
}

我在这里做错了什么?这可以通过任何其他方式完成吗?

tag_id 映射在字典 列表 上,而不是字典。因此,您可以枚举它:

tag_data = validated_data.pop('tag_id', None)
<strong>for tag_item in</strong> tag_data:
    tag = Tag.objects.get_or_create(<strong>**tag_item</strong>)[0]
    validated_data['tag_id'] = tag

由于这些是列表,因此最好在验证数据中列出标签:

tag_data = validated_data.pop('tag_id', None)
validated_data['tag_id'] = <strong>[</strong>
    Tag.objects.get_or_create(**tag_item)[0]
    for tag_item in tag_data
<strong>]</strong>