【问题标题】:Django TypeError get() argument after ** must be a mapping, not list** 之后的 Django TypeError get() 参数必须是映射,而不是列表
【发布时间】:2022-02-10 19:03:35
【问题描述】:

我正在为具有引用标签表的 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"}]
}

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

【问题讨论】:

  • for tag_item in tag_data: tag = Tag.objects.get_or_create(**tag_item)[0]
  • tag_data = valid_data.pop('tag_id', None) for tag_data in tag_item: tag = Tag.objects.get_or_create(**tag_item)[0] combination.tag_id.add(validated_data.get(标签))
  • 谢谢!这有效!

标签: django-rest-framework


【解决方案1】:

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

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

由于这些是列表,因此在验证数据中创建标签列表可能会更好:

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

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2016-05-02
    • 2020-02-03
    相关资源
    最近更新 更多