A]问题摘要:
我的项目中有一对多的数据模型。我需要帮助构建一个查询,以根据“一个”侧数据对象的键获取“多个”侧数据对象。
请参阅“编辑#1”以获取有效但仍然效率低下的代码。
B]问题详情:
1]我有“UserReportedCountry”(一)到“UserReportedCity”(很多),“UserReportedCity”(一)到“UserReportedStatus”(很多)数据模型关系。
2] UserReportedCountry的键是country_name,例如 - “unitedstates”。 UserReportedCity的关键是country_name:city_name,例如“unitedstates:boston”。 UserReportedStatus没有特殊的密钥名称。
3]我的python代码中有用户的国家和城市名称,我想根据城市名称“county_name:city_name”检索所有“UserReportedStatus”对象
C]代码摘录:
1]数据库模型:
class UserReportedCountry(db.Model):
country_name = db.StringProperty( required=True,
choices=['Afghanistan','Aring land Islands']
)
class UserReportedCity(db.Model):
country = db.ReferenceProperty(UserReportedCountry, collection_name='cities')
city_name = db.StringProperty(required=True)
class UserReportedStatus(db.Model):
city = db.ReferenceProperty(UserReportedCity, collection_name='statuses')
status = db.BooleanProperty(required=True)
date_time = db.DateTimeProperty(auto_now_add=True)
2]查询到目前为止我已尝试过:
def get_data_for_users_country_and_city(self,users_country,users_city):
key_name_for_user_reported_city = users_country + ":" + users_city
return UserReportedStatus.all().filter('city.__key__=', key_name_for_user_reported_city ).fetch(limit=10)
D]正在使用的技术
1] Python
2] Google App引擎
3] Django
4] Django模型。
[EDIT#1]
我尝试了以下机制来根据给定的城市和国家/地区查询状态对象。这已经奏效,但我相信这是执行任务的低效机制。
def get_data_for_users_country_and_city(self,users_country,users_city):
key_name_for_user_reported_city = users_country + ":" + users_city
city_object = UserReportedCity.get_by_key_name( key_name_for_user_reported_city )
return UserReportedStatus.gql('WHERE city=:1', city_object)
答案 0 :(得分:1)
您的上一个查询看起来是正确的,我没有看到任何效率低下的问题;事实上,查询by_key_name
非常快速有效。
我认为您的规范化的面向RDMBS的模型设计有改进的余地;由于GAE不支持JOINS,因此在get_data_for_users_country_and_city
调用之后,当您取消引用时,您将过多地访问数据存储区以获取city_name
和country_name
属性。
country_name
模型定义UserReportedCity
属性
UserReportedCity
对象的UserReportedStatus
对象