如何枚举实体的反向引用
Posted
技术标签:
【中文标题】如何枚举实体的反向引用【英文标题】:How to enumerate the back-references of an entity 【发布时间】:2011-04-04 05:48:23 【问题描述】:在这种情况下,company.py 包含:
from django.utils import simplejson
class Company(db.Model):
name=db.StringProperty()
address=db.StringProperty()
def to_JSON():
d = dict([(p, unicode(getattr(self, p))) for p in self.properties()])
return simplejson.dumps(d)
office.py 包含:
from company import Company
class Office(db.Model):
name = db.StringProperty()
company = db.ReferenceProperty(Company, collection_name='offices')
模块 3 包含:
from company import Company
class Region(db.Model):
name = db.StringProperty()
company = db.ReferenceProperty(Company, collection_name='regions')
这是我需要做的一个简化示例,但应该很好地捕捉它......我需要 Company 能够将自己表达为 JSON 字符串,并且它不知道其他类(Office 和地区)引用它。这适用于普通属性:
c = Company(name='A Company',address='123 Main St, New York, NY 12345')
c.put()
dallas = Office(name='Dallas',company=c)
dallas.put()
ny = Office(name='New York',company=c)
ny.put()
northeast = Region(name='NorthEast',company=c)
northeast.put()
southwest = Region(name='SouthWest',company=c)
southwest.put()
logging.info('Company as JSON: %s' % c.to_JSON())
我得到的输出是:
"name": "A Company", "address": "123 Main St, New York, NY 12345"
所以 properties() 包含预期的实体属性,但我还想包含来自关联对象的 ReferenceProperty 属性的反向引用。基本上我正在寻找的只是一个反向引用(collection_name)名称的列表,因为我知道它们代表查询,但我找不到任何方法来枚举反向引用名称本身。
请记住,此代码实际上并不代表真实代码,它已大大简化。现在可以了:
offices = getattr(company, 'offices')
所以我期待看到的是这样的:
"name": "A Company", "address": "123 Main St, New York, NY 12345",
"offices": "<db.Query object at 0x110e992d0>",
"regions": "<db.Query object at 0x110e99300>"
我实际上并不需要将反向引用“办公室”和“区域”包含在 properties() 枚举中,但是以某种方式检查了它们的唯一性(我不能,例如,在 Company 中也有一个名为“offices”的 StringProperty),因此必须有一种方法来枚举它们。有人知道方法吗?
【问题讨论】:
【参考方案1】:唯一性检查只是针对类字典(即,为类对象提供名称和值之间的映射的内部对象)。您可以通过检查 Company.__dict__
来迭代这些。不过,这包括所有内容 - 内置 Python object
的所有属性、属性和方法,同样适用于 db.Model
和任何其他父类。
您最好的选择是遍历类 dict,检查每个项目以查看它是否是 _ReverseReferenceProperty
的实例:
for propname, prop in Company.__dict__.iteritems():
if isinstance(prop, db._ReverseReferenceProperty):
# Do something with prop, such as getting a query with getattr(a_company, propname).
【讨论】:
【参考方案2】:假设您没有为collection_name
赋值,只需将其保留为Modelname_set
。然后你可以dir(model)
,选择以_set
结尾的属性,这些就是反向引用。或者您可以制定一个约定来命名它们,例如。 groups_refs
,并搜索以_refs
结尾的属性。
【讨论】:
以上是关于如何枚举实体的反向引用的主要内容,如果未能解决你的问题,请参考以下文章
PrimeFaces Mobile 反向幻灯片过渡给了我“对实体“反向”的引用必须以“;”结尾定界符。´ [重复]