2010-01-13 16 views
7

Sto tentando di utilizzare un'implementazione di categoria simile a this one nel wiki di Django. Mi chiedo quale sia il modo Django di fare una ricerca per estrarre tutti gli oggetti associati a una categoria padre. Ad esempio, se ho una categoria "TV" e ha sottocategorie "LED", "LCD" e "Plasma", come potrei facilmente interrogare per tutte le TV senza ricorrere in modo ricorsivo in tutte le sottocategorie e sottocategorie (se ci sono sono qualsiasi).Ricerche di categoria e sottocategoria di Django

Codice saggio stavo pensando qualcosa del tipo:

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

Quindi, con questo tipo di implementazione non v'è alcun modo semplice per fare quello che mi serve, o c'è qualche altra soluzione migliore?

Grazie!

+0

Gli articoli possono essere in più di una categoria? – czarchaic

+0

No, possono essere solo in una categoria, ma in questo caso si trovano anche nella categoria padre (tipo di ereditarietà) –

risposta

8

Se si desidera applicare rigorose categorie e sottocategorie, ma è anche possibile eseguire ricerche veloci con risultati simili a quelli descritti, è possibile creare una tabella di "tag" in cui non si consente effettivamente agli utenti di contrassegnare gli elementi stessi , ma piuttosto non appena assegni una categoria a un oggetto, compili la tabella delle etichette per quell'elemento con tutte le categorie genitore fino al nodo radice dell'albero delle categorie.

Per esempio, se avete la seguente: alt text http://img509.yfrog.com/img509/9845/photoho.jpg

La tabella delle variabili sarebbe un aspetto simile:

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 

Ora il vostro set di query sarà simile items=Item.objects.filter(tag='TV')

5

Supponendo che si sta utilizzando il modello Category allo stesso modo in cui è in uso sulla pagina si fa riferimento, sembrerebbe che una categoria 'TV' sarebbe un esempio Category con un nulla parent, e 'plasma' & 'LCD 'sarebbe Category istanze con la categoria' TV 'come genitore.

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

Creare alcune voci

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

ottenere l'elemento QuerySet

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

o

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

Ti sembra che sia nel campo da baseball di che cosa avete bisogno?

+0

Potrebbe essere possibile eseguire sottocategorie? Ad esempio, se Vizio era effettivamente un'altra categoria e quindi c'era un articolo come questo: specific_model_number = Articolo (nome = "modello43534", categoria = vizio) non avrebbe "articoli = Item.objects.filter (category__parent = tv) " non restituisce l'oggetto specific_model_number nel set di risultati? –

+0

Puoi modificare il tuo post o aggiungere una risposta con il tipo di codice che utilizzerai e delineare i tuoi dubbi? Sto cercando di capire esattamente di cosa hai bisogno. Ad esempio, nel queryset precedente, durante il looping, ogni elemento avrebbe un nome e una 'Category'. È possibile nella tua applicazione per una categoria avere 'vizio' come genitore (cioè sottocategorie)? – czarchaic

+0

Sì, una categoria potrebbe avere vizio come genitore. La mia preoccupazione è che un queryset non restituisca ogni elemento all'interno di un sottoinsieme dell'albero delle categorie. Se avessi un set di query solo per "category__parent = tv" otterrei tutti gli elementi "vizio" restituiti anche se sono 2 nodi lungo l'albero? Non so come modificare il post per spiegarlo meglio, quindi mi scuso perché è confuso e apprezzo molto il tuo aiuto fino ad ora. –

0

Se si utilizza Django -categories, che utilizza MPTT, quindi è possibile effettuare le seguenti operazioni:

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