【发布时间】:2016-03-29 16:14:27
【问题描述】:
我需要有效地将大量数据从我的数据库导出到 CSV,但我遇到了 ManyToMany 字段的问题。假设我的模型是Song,我正在使用一个名为Tags 的ManyToMany 字段。一个Song 可能有几个Tags,比如'rock'、'pop'、'sad'...
我想做这样的事情:
>>> songs_tags = Song.objects.filter(artist_id=5).values('id', 'tags__name')
然后我想得到类似的东西:
>>> songs_tags
[{'id': 1L, 'tags__name':['rock', 'pop', 'happy']}, {'id': 2L, 'tags__name': ['metal', 'angry', 'epic']}, ...]
然而,我实际得到的是:
>>> songs_tags
[{'id': 1L, 'tags__name': 'rock'}, {'id': 2L, 'tags__name': 'metal'}, ...]
为什么?
我检查了这些元素确实有多个标签,但 values() 只报告其中一个,而不是全部。
注意:
我尝试迭代 for song in Song.objects.filter(artist_id=5) 并读取每个 song.tags.all()。但它很慢......
我也尝试使用prefetch_related() (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#prefetch-related)。我所做的是迭代for song in Song.objects.filter(artist_id=5).prefetch_related('tags') 并阅读每个song.tags.all(),但它也很慢。事实上,我没有注意到迭代 Song.objects.filter(artist_id=5) 和 Song.objects.filter(artist_id=5).prefetch_related('tags') 之间有什么区别。
【问题讨论】:
标签: python django performance export many-to-many