1

我试图在我的 Django 数据库中选择标签是给定列表中的任何歌曲的所有歌曲。有 Song 模型、Tag 模型和 SongTag 模型(用于多对多关系)。

这是我的尝试:

taglist = ["cool", "great"]
tags = Tag.objects.filter(name__in=taglist).values_list('id', flat=True)
song_tags = SongTag.objects.filter(tag__in=list(tags))

此时我收到一个错误:

DatabaseError: MultiQuery does not support keys_only.

我怎么了?如果您可以提出一种完全不同的方法来解决问题,那也将非常受欢迎!

编辑:我应该提到我在Google AppEngine上使用 Django和 django-nonrel

4

3 回答 3

6

您不应该使用与 AppEngine 的 m2m 关系。NoSQL 数据库(BigTable 就是其中之一)通常不支持 JOIN,程序员应该对数据结构进行非规范化。这是一个深思熟虑的设计理念:虽然您的数据库将包含冗余数据,但您的读取查询会更简单(无需组合来自 3 个表的数据),这反过来也使 DB 服务器的设计更加简单(当然这是为了优化和缩放而制作的)

在您的情况下,您可能应该摆脱 Tag 和 SongTag 模型,并将标签作为字符串存储在 Song 模型中。我当然假设 Tag 模型只包含 id 和 name,如果 Tag 实际上包含更多数据,你应该仍然有 Tag 模型。在这种情况下,歌曲模型应该同时包含 tag_id 和 tag_name。正如我上面解释的那样,这个想法是为了更简单的查询而引入冗余

于 2011-08-30T23:32:30.603 回答
4

请让 ORM 为您构建查询:

song_tags = SongTag.objects.filter(tag__name__in = taglist)
于 2011-08-30T18:23:44.310 回答
0

您应该尝试只使用一个查询,以便 Django 也只使用连接生成一个查询。像这样的东西应该工作:

Song.objects.filter(tags__name__in=taglist)

您可能需要更改此示例中的一些名称(很可能是tagsin tags__name__in),请参阅https://docs.djangoproject.com/en/1.3/ref/models/relations/

于 2011-08-30T18:26:47.663 回答