2010-01-13 28 views
7

Estoy intentando utilizar una implementación de Categoría similar a this one en Wiki Django. Me pregunto cuál es la forma Django de hacer una búsqueda para extraer todos los objetos asociados con una categoría principal. Por ejemplo, si tengo una categoría "TV" y tiene subcategorías "LED", "LCD" y "Plasma", ¿cómo podría consultar fácilmente todos los televisores sin recurrir a todas las subcategorías y subcategorías (si existen hay alguno).Django Categoría y búsquedas de subcategoría

Código sabia que estaba pensando algo como:

class Item(models.Model): 
    name = ... 
    ... 
    category = models.ForeignKey(Category, null=True, blank=True) 

por lo que con este tipo de aplicación ¿hay alguna manera fácil de hacer lo que necesito, o hay alguna otra solución mejor?

¡Gracias!

+0

¿Pueden los artículos estar en más de una categoría? – czarchaic

+0

No, solo pueden estar en una categoría, pero también serían parte de la categoría padre (tipo de herencia similar) –

Respuesta

8

Si desea aplicar categorías y subcategorías estrictas, pero también tiene la capacidad de realizar búsquedas rápidas con resultados como los que describe, puede crear una tabla de "etiquetas" donde no permita realmente que los usuarios etiqueten los elementos ellos mismos , pero en vez de asignar una categoría a un elemento, completa la tabla de etiquetas para ese elemento con todas las categorías principales hasta el nodo raíz del árbol de categorías.

Por ejemplo, si usted tiene la siguiente: alt text http://img509.yfrog.com/img509/9845/photoho.jpg

La tabla de variables sería algo como:

id | tag_name | tv_id 
    1 |  "tv"  |  1 
    2 |  "sd"  |  1  
    3 |  "crt" |  1 
    4 |  "tv"  |  2 
    5 |  "HD"  |  2 
    6 |  "LCD" |  2 
    7 |  "tv"  |  3 
    8 |  "HD"  |  3 
    9 | "plasma" |  3 

Ahora su queryset se verá como items=Item.objects.filter(tag='TV')

5

Suponiendo que está usando el modelo Category la misma forma en que está siendo utilizado en la página que se hace referencia, parecería que una categoría 'TV' sería un ejemplo Category con un nulo parent, y 'LCD 'plasma' & 'Sería Category instancias con la categoría' TV 'como padre.

>>> tv=Category(name="TV") 
>>> tv.save() 
>>> lcd=Category(name="LCD", parent=tv) 
>>> lcd.save() 
>>> plasma=Category(name="Plasma", parent=tv) 
>>> plasma.save() 

Cree algunos artículos

>>> vizio=Item(name="Vizio", category=lcd) 
>>> vizio.save() 
>>> plasmatron=Item(name="PlasmaTron", category=plasma) 
>>> plasmatron.save() 

conseguir el artículo queryset

>>> items=Item.objects.filter(category__parent=tv) 

o

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

¿Esto parece que está en el estadio de béisbol de lo que necesita?

+0

¿Podría esto hacer subsubcategorías? Por ejemplo, si Vizio era realmente otra categoría y luego había un elemento como este: specific_model_number = Item (name = "model43534", category = vizio) would not "items = Item.objects.filter (category__parent = tv) " no devuelve el objeto specific_model_number en el conjunto de resultados? –

+0

¿Puedes editar tu publicación o agregar una respuesta con el tipo de código que utilizarás y explicar tus inquietudes? Estoy tratando de entender exactamente lo que necesitas. Por ejemplo, en el conjunto de preguntas anterior, al pasar por él, cada elemento tendría un nombre y una "Categoría". ¿Es posible en su solicitud para una categoría tener 'vizio' como padre (es decir, subcategorías)? – czarchaic

+0

Sí, una categoría podría tener vizio como padre. Mi preocupación es que un conjunto de preguntas no devuelva todos los elementos dentro de un subconjunto del árbol de categorías. Si tuviera un conjunto de consulta solo para "category__parent = tv", ¿obtendría todos los elementos de "vizio" devueltos aunque sean 2 nodos en el árbol? No sé cómo editar la publicación para explicarla mejor, así que me disculpo porque es confusa y realmente aprecio tu ayuda hasta el momento. –

0

Si está utilizando Django -categorías, que utiliza MPTT, a continuación, puede hacer lo siguiente:

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