【问题标题】:How to access field in list of JSON objects in a django SerializerMethodField?如何访问 django SerializerMethodField 中 JSON 对象列表中的字段?
【发布时间】:2022-02-05 21:35:31
【问题描述】:

我正在为一个游戏创建一个 API,用户可以在其中获得标记图像的积分。如果用户用与另一个标签相同的标签标记了图像,则分数会更新 5 分(如果该玩家是他们的对手,则更新 25 分)。我已将序列化程序中的字段分数声明为 SerializerMethodField。

在 get_score 方法中,我试图访问 tags_to_compare 列表中的 tag__name 字段,然后简单地提取字符串并将它们存储在一个列表中。

我在我的序列化程序中尝试了以下内容:

更新 我已将我的 get_score 方法更新如下:

serializers.py

  score = serializers.SerializerMethodField('get_score')

...

  def get_score(self, tagging):
    score = 0
    resource_id = tagging.resource.id
    # A previously played gameround for this resource is coordinated for Tag verification
    coordinated_gameround = Gameround.objects.all().filter(taggings__resource_id=resource_id).order_by("?").first()
    # list of tag_name from coordinated gameround
    coordinated_gameround_tags = coordinated_gameround.taggings.all().values_list("tag__name", flat=True)

    if Tag.objects.all().filter(name=tagging) in coordinated_gameround_tags:
      score += 25

return score

我测试了以下行,它检索了一个标记列表。

coordinated_gameround_tags = coordinated_gameround.taggings.all().values_list("tag__name", flat=True)

这是标签列表所在的 JSON 对象:

{
    "gameround": {
        "id": 2014305513,
        "user": {
            "id": 1,
            "username": "carina",
            "is_superuser": true
        },
        "score": 50,
        "tags_to_compare": [
            {
                "tag_id": 153,
                "tag__name": "night",
                "tag__language": "en",
                "resource_id": 323570
            },
            {
                "tag_id": 10437,
                "tag__name": "dress",
                "tag__language": "en",
                "resource_id": 323570
            },
            {
                "tag_id": 9598,
                "tag__name": "sleep",
                "tag__language": "en",
                "resource_id": 323570
            }
        ]
    }
}

【问题讨论】:

    标签: json django-rest-framework django-serializer


    【解决方案1】:

    coordinated_gameround 是您模型的 Gameround 实例。不是字典。所以你不能用coordinated_gameround[key]访问它。

    如果您的 Gameround 有一个名为“名称”或“语言”的字段,您可以使用这些值获取这些值

    name = coordinated_gameround.name
    langage = coordinated_gameround.langage
    

    另外,这行可能有错误

    Tag.objects.all().filter(name=tagging) in coordinated_gameround_tags
    

    您是否希望coordinated_gameround_tags 包含查询集列表?

    【讨论】:

    • 那么有没有更好的方法将值 ["night", "dress", "sleep"] 存储在列表中?
    • 您必须能够进行 1 次查询,以检查用户是否符合您设置的条件。在您的函数中检查此查询的有效性(使用.exists())将毫不费力地返回分数。然后你就会有类似 ``` queryset = Tag.objects.filter(...) return 25 if query.exists() else 0 ``
    • 好的,我想我通过使用coordinated_gameround_tags = coordinated_gameround.taggings.all().values_list("tag__name", flat=True) 解决了
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 2021-06-06
    • 1970-01-01
    • 2019-04-27
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多