2010-01-13 10 views
7

Ich versuche, eine ähnliche Kategorie Implementierung zu this one in der Django Wiki zu verwenden. Ich frage mich, wie Django eine Suche durchführt, um alle Objekte zu ziehen, die einer übergeordneten Kategorie zugeordnet sind. Zum Beispiel, wenn ich eine Kategorie "TV" habe und die Unterkategorien "LED", "LCD" und "Plasma" haben, wie könnte ich einfach nach allen Fernsehern suchen, ohne rekursiv alle Unterkategorien und Unterkategorien zu durchlaufen (falls vorhanden) sind irgendwelche). weiseDjango Kategorie und Unterkategorie sucht

-Code Ich dachte so etwas wie:

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

so mit dieser Art der Implementierung ist es eine einfache Möglichkeit zu tun, was ich brauche, oder gibt es eine andere bessere Lösung?

Vielen Dank!

+0

Können Artikel in mehr als einer Kategorie enthalten sein? – czarchaic

+0

Nein, sie können nur in einer Kategorie sein, aber dann wären sie auch Teil der Elternkategorie (Art der Vererbung) –

Antwort

8

Wenn Sie strikte Kategorien und Unterkategorien erzwingen wollen, aber auch schnelle Suchen mit Ergebnissen durchführen können, die Sie beschreiben, sollten Sie eine "Tag" -Tabelle erstellen, in der Benutzer die Elemente nicht selbst markieren können , aber sobald Sie einem Element eine Kategorie zuweisen, füllen Sie die Tag-Tabelle für dieses Element mit allen übergeordneten Kategorien bis zum Stammknoten des Kategoriebaums aus.

Zum Beispiel, wenn Sie die folgenden Schritte aus: alt text http://img509.yfrog.com/img509/9845/photoho.jpg

Die Tag-Tabelle würde in etwa so aussehen:

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 

Jetzt ist Ihre queryset wie items=Item.objects.filter(tag='TV')

5

Angenommen, Sie sind mit dem Category Modell die gleiche Art und Weise es auf der Seite verwendet wird, um Sie verwiesen wird, so scheint es, dass eine Kategorie ‚TV‘ eine Category Instanz mit einem Null wäre parent und & ‚Plasma‘ ‚LCD 'wäre Category Instanzen mit der' TV 'Kategorie als Eltern.

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

Erstellen Sie einige Artikel

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

der Artikel

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

oder

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

Enthält diese aussehen, wie es ist im Baseballstadion von dem, was Sie brauchen Get QuerySet?

+0

Wäre das in der Lage Subsubkategorien zu erstellen? Zum Beispiel, wenn Vizio eigentlich eine andere Kategorie war und dann gab es einen Artikel wie diesen: specific_model_number = Artikel (name = "model43534", category = vizio) würde nicht "items = Item.objects.filter (category__parent = tv) " nicht das Objekt specific_model_number in der Ergebnismenge zurückgeben? –

+0

Können Sie Ihren Beitrag bearbeiten oder eine Antwort mit der Art des verwendeten Codes hinzufügen und Ihre Bedenken darlegen? Ich versuche genau zu verstehen, was du brauchst. Zum Beispiel würde in dem obigen Abfrage-Set jedes Element beim Durchschleifen einen Namen und eine 'Kategorie' haben. Ist es in Ihrer Bewerbung für eine Kategorie möglich, "vizio" als Elternteil (d. H. Unterkategorien) zu haben? – czarchaic

+0

Ja, eine Kategorie könnte vizio als Elternteil haben. Meine Sorge ist, dass ein Abfrage-Set nicht jedes Element innerhalb einer Teilmenge des Kategoriebaums zurückgibt. Wenn ich ein Suchfeld nur für "category__parent = tv" hätte, würde ich alle "vizio" -Elemente zurückgeben, obwohl sie 2 Knoten im Baum sind? Ich weiß nicht, wie ich den Beitrag bearbeiten soll, um ihn besser zu erklären, also entschuldige ich mich, weil er verwirrend ist und ich schätze deine Hilfe bisher sehr. –

0

aussehen Wenn Sie django verwenden -Kategorien, die MPTT verwendet, dann können Sie Folgendes tun:

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