Je construis une application d'exploitation forestière de base en ce moment et j'ai un modèle TODO qui utilise Django-Taggit. Mon modèle Todo ressemble à ceci:
'tags' does not resolve to a item that supports prefetching - this is an invalid parameter to prefetch_related().
4 Réponses :
SOUTION LÉGALEMENT HAPAINH:
ct = ContentType.objects.get_for_model(Todo) todo_pks = [each.pk for each in project.todo_set.all()] tagged_items = TaggedItem.objects.filter(content_type=ct, object_id__in=todo_pks) #only one db query unique_tags = set([each.tag for each in tagged_items])
Une réponse légèrement moins hacraissante que celle d'Akshar, mais seulement légèrement ...
Vous pouvez utiliser préfetch_related tant que vous traversez vous-même les relations Tagged_Item vous-même, à l'aide de la clause Prefetch_Related ('Tagged_items__Tag') code> . Malheureusement,
todo.tags.All () code> ne profitera pas de ce préfetch - le manager "Tags" finira toujours de faire sa propre requête - de sorte que vous devez démissionner sur la relation tagged_items aussi . Cela devrait faire le travail: p>
taggit prend maintenant en charge Cette fonctionnalité a été introduite dans Cette demande de traction . Dans le cas de test pour elle , notez que, après préchargement Tags utilisant préfetch_related code> directement sur les champs de balises (version 0.11.0 et ultérieure, publié 2013-11-25). P>
.prefetch_related ('Tags') code>, il existe 0 requêtes supplémentaires pour la liste des tags. P>
Je suis surpris qu'il n'y ait toujours pas une réponse pour cela .. Avez-vous déjà trouvé un?
@teewuane: Taggit a récemment ajouté une fonctionnalité pour cela.