帮助构建一对多关系的GQL查询

时间:2011-04-19 00:40:49

标签: python django google-app-engine django-models

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)

1 个答案:

答案 0 :(得分:1)

您的上一个查询看起来是正确的,我没有看到任何效率低下的问题;事实上,查询by_key_name非常快速有效。

我认为您的规范化的面向RDMBS的模型设计有改进的余地;由于GAE不支持JOINS,因此在get_data_for_users_country_and_city调用之后,当您取消引用时,您将过多地访问数据存储区以获取city_namecountry_name属性。

你能做什么? 非规范化预取

  1. country_name模型定义
  2. 中添加UserReportedCity属性
  3. Prefetch ReferenceProperty 检索每个UserReportedCity对象的UserReportedStatus对象