7
votes

Django-Taggit Prefetch_Related

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().


2 commentaires

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.


4 Réponses :


3
votes

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])


0 commentaires

1
votes

utiliser django-marquage et méthode usage_for_model xxx


0 commentaires

0
votes

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') . Malheureusement, todo.tags.All () 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: xxx


0 commentaires

7
votes

taggit prend maintenant en charge préfetch_related directement sur les champs de balises (version 0.11.0 et ultérieure, publié 2013-11-25).

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 .prefetch_related ('Tags') , il existe 0 requêtes supplémentaires pour la liste des tags.


0 commentaires