2012-04-02 7 views
0

Ich bin auf der Suche nach der intelligentesten/vielfältigsten Art der Handhabung von Kategorien in App Engine. Ich sehe zwei Ansätze:Unterschiedliche Arten der Eingabe von Kategorien in Google App Engine

Google App Engine Data Store Model Reference Another Class

mit Weg A:

companycategory = db.ReferenceProperty(mycategories, collection_name = 'categories') 

aus dem Beispiel in der URL:

class Category(db.Model) 
    name = db.StringProperty(required=True) 
    city = db.ReferenceProperty(City, collection_name = 'categories') 

und Weise B:

companycategory = db.CategoryProperty(default="A", choices=["A", "AA", "B", "C"], required=True) 

Gibt es ein Alles andere, was man beachten sollte. A verwendet eine Tabelle und ein anderes Objektmodell, das übertrieben erscheint, aber Weg B setzt Text in Felder, was bedeutet, dass sich Tippfehler leicht einschleichen können. Wenn man ganze Zahlen in das Kategorienfeld einfügt und manuell referenziert, gibt es eine kluge Möglichkeit, etwas anderes zu tun? Oder beiße ich die Kugel mit einem anderen Modell/Tisch?

Vielen Dank im Voraus

Antwort

2

Check-out kann für eine andere Option taggable-mixin.

Die "intelligenteste" Methode zur Handhabung von Kategorien in AppEngine hängt von Ihrem Anwendungsfall ab.

Haben Sie eine vordefinierte Liste von Kategorien oder erlauben Sie Ihren Benutzern, dynamisch eigene Kategorien hinzuzufügen? Die beste Antwort kann je nach Fall variieren.

In den meisten Fällen mit AppEngine möchten Sie normalerweise mit der Option "de-normalized" gehen. Sie sparen Geld beim Schreiben und Lesen von Datenspeichern. Und weil es weniger schreibt und liest, ist es auch schneller.

Sie können auch db.StringListProperty() anstelle von db.CategoryProperty() verwenden, damit ein Unternehmen in mehreren Kategorien abgelegt werden kann.

Wenn Sie wissen, was Ihre möglichen Kategorien der Zeit voraus sind, würde ich ähnlich wie dies etwas tun:

class Company(db.Model): 
    name = db.StringProperty() 
    category = db.StringListProperty() #to allow multiple categories 

#Creating a company 
company = Company() 
company.name = "XYZ Car Rental Corporation" 
company.category = ["NEW YORK","CAR RENTAL", "CORPORATION"] #City and Company Category. I would make them all uppercase to prevent case-sensitive/typo issues. 
company.put() 

#querying 
query = Company.all() 
query.filter('category',"NEW YORK") 
results = query.fetch(10) #this returns Company entities with "NEW YORK" in their category list 

#You can also do multiple categories (AND) 
query = Company.all() 
query.filter('category',"NEW YORK") 
query.filter('category',"CORPORATION") 
results = query.fetch(10) #this returns Company entities with "NEW YORK" and "CORPORATION" in their category list 

Wenn die Benutzer Kategorien dynamisch erstellen, und es gibt relativ wenige (weniger als 1000) Einheiten zu Unter einer bestimmten Kategorie würde ich taggable-mixin empfehlen.

+0

@Dave: Wenn Sie neu anfangen, sollten Sie das neuere NDB-Modul anstelle der DB verwenden: https://developers.google.com/appengine/docs/python/ndb/. Da Sie sich Sorgen wegen Tippfehlern usw. gemacht haben, können Sie auch einen separaten Speicher für alle gültigen Kategorien erstellen und die Eingaben dagegen prüfen, um sicherzustellen, dass das, was gespeichert ist, angemessen ist. – Sologoub

+0

Danke. Ich denke, eine meiner Komplikationen ist das Django-Framework. Die Art der Saite, die nicht so elegant ist wie die Tasten, würde für diesen Anwendungsfall gut funktionieren. Wie auch immer, ich habe Probleme mit der Django-Vorlage. Ich erhalte den folgenden Fehler: 'code'BadValueError: Eigenschaft firmencategory ist ['B', 'i', 'o']; muss einer von ['Bio', 'Pharm', 'I', ''] 'code 'sein, wenn ich den folgenden' code'-Firmencategory = db.StringListProperty (default = "Bio", Auswahl = ["Bio", "Pharm", "I", "S"], erforderlich = True) 'code' – Androidian

+0

@Dave: Ändere den Standardwert =" Bio "auf default = [" Bio "]. StringListProperty erwartet eine Liste von Strings (sogar eine Liste mit einem String), aber keinen String. – Albert