7
votes

Recherches de catégorie et sous-catégorie Django

J'essaie d'utiliser une implémentation de catégorie similaire à Celui-ci dans le Django Wiki. Je me demande quelle est la manière Django de faire une recherche pour tirer tous les objets associés à une catégorie mère. Par exemple, si j'ai une catégorie "TV" et que des sous-catégories "LED" "," LCD "et" Plasma ", comment puis-je pouvoir facilement interroger pour tous les téléviseurs sans traverser de manière récursive toutes les sous-catégories et toutes les sous-catégories (s'il y a sont) Toute autre solution meilleure?

merci!


2 commentaires

Les articles peuvent-ils être dans plus d'une catégorie?


Nope ils ne peuvent être que dans une catégorie, mais ils se séparaient également de la catégorie des parents (genre de héritage)


3 Réponses :


5
votes

supposant que vous utilisez la catégorie code> code> de la même manière qu'il est utilisé sur la page que vous avez référencée, il semblerait qu'une catégorie 'TV' serait une catégorie code> instance avec un null parent code> et "plasma" et "lcd" serait catégorie code> des instances avec la catégorie "TV" en tant que parent. xxx pré>

créer des éléments p> xxx pré>

Obtenez l'élément QuerySet P>

>>>> items=Item.objects.filter(category__parent__name='TV')


6 commentaires

Est-ce que cela pourrait faire des substituts? Par exemple, si Vizio était en réalité une autre catégorie, il y avait un élément comme celui-ci: SPÉCIFIQUE_MODEL_NUMBER = ITEM (nom = "Model43534", Catégorie = Vizio) ne serait pas "Articles = item.ObjectS.Filter (catégorie__parent = TV)" renvoyer l'objet spécifique_model_number dans le jeu de résultats?


Pouvez-vous modifier votre message ou ajouter une réponse avec le type de code que vous utiliserez et décrivez vos préoccupations? J'essaie de comprendre exactement ce dont vous avez besoin. Par exemple, dans le query ci-dessus, lors de la boucle à travers elle, chaque élément aurait un nom et une catégorie . Est-il possible dans votre application pour une catégorie d'avoir vizio en tant que parent (c'est-à-dire sous-catégories sous-catégories)?


Oui une catégorie pourrait avoir Vizio en tant que parent. Mon inquiétude est qu'un queryset ne renvoie pas chaque article dans un sous-ensemble de l'arborescence de la catégorie. Si j'avais un queryset juste pour "Catégorie__Parent = TV" Souhaitez-vous que tous les éléments "Vizio" sont revenus même s'ils sont 2 nœuds dans l'arbre? Je ne sais pas comment éditer le poste pour l'expliquer mieux, alors je m'excuse parce que c'est déroutant et j'apprécie vraiment votre aide jusqu'à présent.


Je pars pour le travail, alors je vais mettre à jour quand je rentrerai à la maison, mais une question rapide. Le code dans ma réponse ressemble-t-il à ce que votre application s'attend. (c'est-à-dire que nous sommes sur la bonne voie?). Pouvez-vous me donner des idées sur quel type de catégorie peut avoir LCD ou plasma en tant que parent?


Ceci est absolument sur la bonne voie! J'utilisais simplement des téléviseurs comme exemple, et peut-être que ce n'est pas le meilleur exemple. Disons qu'un "télé" peut être "HD" ou "SD". Pour "HD", il y a "LCD" et "plasma". Et plus loin, sous "LCD" Il existe une catégorie "Vizio", comment une queryset qui a des arguments "Catégorie__Parent = TV" renvoie tous les éléments classés comme vizio. Le parent Vizio est "LCD", pas "TV", de sorte que cela ne serait donc pas retourné, mais je veux que toutes les téléviseurs tombent sous la catégorie "TV", elle devrait donc être renvoyée.


Bonjour Jordan, une autre question rapide avant de revenir dans votre code. Quelle est la profondeur des catégories? Serait-il possible d'avoir une catégorie 40inch avec un parent graphique qui a lui-même un parent vizio dont le parent est lcd Dont le parent est TV ? (hypothétiquement parlant)



8
votes

Si vous souhaitez appliquer des catégories strictes et des sous-catégories, mais vous avez également la possibilité d'effectuer des recherches rapides avec des résultats tels que vous décrivez, vous voudrez peut-être créer une table "Tag" dans laquelle vous ne permettez pas aux utilisateurs de marquer des objets eux-mêmes, Mais plutôt dès que vous attribuez une catégorie à un élément, vous remplissez la table de balises pour cet élément avec toutes les catégories parent jusqu'à le nœud racine de l'arborescence de la catégorie.

Par exemple, si vous avez ce qui suit: text alt http://img509.yfrog.com/img509/9845/photoho.jpg

La table d'étiquette ressemblerait à quelque chose comme: xxx

maintenant votre queryset ressemblera à items = item.Object.filter (tag = 'TV ")


0 commentaires

0
votes

Si vous utilisez Django-Catégories, qui utilise MPTT, vous pouvez procéder comme suit:

Entry.objects.filter(category__in=category.get_descendants(True))


0 commentaires