2012-04-02 2 views
0

Я ищу самый умный/способ управления категориями в App Engine. Я вижу два подхода:Различные способы ввода категорий в Google App Engine

Google App Engine Data Store Model Reference Another Class

используя способ A:

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

из примера в URL:

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

и способ B:

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

Есть ли что еще нужно рассмотреть. A использует таблицу и другую объектную модель, которая кажется излишней, но способ B помещает текст в поля, что означает, что опечатка вполне может закрадываться. Короче говоря, целые числа в поле категории и ручная привязка - это разумный способ сделать что-нибудь еще? Или я кусаю пулю с другой моделью/таблицей?

Заранее спасибо

ответ

2

Вы можете проверить taggable-mixin другой вариант.

«Самый умный» способ обработки категорий в AppEngine варьируется в зависимости от вашего прецедента.

У вас есть предопределенный список категорий или вы позволяете своим пользователям динамически добавлять свои собственные категории? Лучший ответ может отличаться в зависимости от вашего конкретного случая.

В большинстве случаев с AppEngine вы обычно хотите перейти с «де-нормированной» опцией. Это экономит ваши деньги с точки зрения хранения и чтения данных. И поскольку он делает меньше операций записи и чтения, он также быстрее.

Вы также можете использовать db.StringListProperty() вместо db.CategoryProperty(), чтобы разрешить компании подавать документы по нескольким категориям.

Если вы знаете, что ваши возможные категории опережают время, я хотел бы сделать что-то похожее на это:

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 

Если пользователи создают категории динамически, и относительно мало (менее 1000) субъектов к быть под определенной категорией, я бы порекомендовал taggable-mixin.

+0

@Dave: Если вы начинаете новый, вы можете рассмотреть возможность использования более нового модуля NDB вместо базы данных: https://developers.google.com/appengine/docs/python/ndb/. Кроме того, поскольку вас беспокоили опечатки и т. Д., Вы можете создать отдельное хранилище для всех допустимых категорий и проверить ввод данных, чтобы гарантировать, что то, что хранится, является подходящим. – Sologoub

+0

Спасибо. Я думаю, что одним из моих осложнений является инфраструктура Django. Строковый путь, хотя и не такой элегантный, как клавиши, будет хорошо работать для этой утилиты. Однако у меня возникают проблемы с шаблоном Django, я получаю следующую ошибку: 'code'BadValueError: Property companycategory - ['B', 'i', 'o']; должен быть одним из ['Bio', 'Pharm', 'I', ''] 'code', когда я использовал следующий« code' companycategory = db.StringListProperty (default = «Bio», choice = [«Bio», «Фарм», «I», «S»], обязательно = True) 'code' – Androidian

+0

@Dave: изменить значение по умолчанию =« Bio »на значение по умолчанию = [« Bio »]. StringListProperty ожидает список строк (даже список одной строки будет делать), но не строку. – Albert