【问题标题】:Fetch data in many-many relationship in a single row在单行中以多对多关系获取数据
【发布时间】:2021-03-28 11:47:12
【问题描述】:

这些是我的模型

团队表

class Team(CommonModel):
    ****Other Fields****
    name = models.CharField()
    game = models.ManyToManyField(Game, through='Team_Game')

映射表

class Team_Game(CommonModel):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    status = models.SmallIntegerField(default=1)
    class Meta:
        db_table = 'team_game'

游戏桌

class Game(CommonModel):
    name = models.CharField(max_length=128, blank=False, null=False, unique=True)
    status = models.SmallIntegerField(default=1)

我想检索 id 为 1 的团队和与之关联的游戏 预期数据:team.name、other_team_cols、[game_id1、game_id2]

查询:

team_data = Team.objects.filter(id=1).values('id', 'name', 'game__name')

输出:

[
    {
        "id": "1",
        "name": 'abc',
        "game__name": "game1"
    },
    {
        "_packageID": "1",
        "name": "def",
        "game__name": "game2"
    }
]

预期输出:

{
        "id": "1",
        "name": 'abc',
        "game__name": ["gam1", "gam2"]
}

【问题讨论】:

  • 您的查询生成的 SQL 不会将游戏名称聚合到数组中。如果你使用 postgres,那么你可以使用ArrayAgg (docs.djangoproject.com/en/3.1/ref/contrib/postgres/aggregates/…)。所以查询可能看起来像Team.objects.filter(id=1).aggregate(game__names=ArrayAgg('game__name')).values('id', 'name', 'game__names')。我不知道像game__name这样的数组聚合的命名输出是否不会以某种方式干扰模型字段。

标签: django django-models django-rest-framework django-orm mysql-python


【解决方案1】:

声明一个数组迭代循环并存储游戏__name valuesOutput

team_data=[
    {
        "id": "1",
        "name": "abc",
        "game__name": "game1"
    },
    {
        "_packageID": "1",
        "names": "def",
        "game__name": "game2"
    }
]
arr=[]

for report in team_data :
    
    arr.append(report["game__name"])
print(arr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2015-04-05
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多