如何枚举实体的反向引用

在这种情况下,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')
这是我需要做的简化示例,但应该很好地捕获它...我需要公司能够将自己表达为JSON字符串,并且它不知道其他类(Office和Region)参考它。这适用于正常属性:
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>"
}
我实际上并不需要将back-references“offices”和“regions”包含在properties()枚举中,但是它们会以某种方式检查它们的唯一性(例如,我不能在公司中使用StringProperty)命名为“办公室”)因此必须有一种方法来枚举它们。有人知道吗?     
已邀请:
检查唯一性只是针对类dict(即,提供类对象的名称和值之间的映射的内部对象)。您可以通过检查
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).
    
假设您没有为
collection_name
分配值,只需将其保留为
Modelname_set
。然后你可以
dir(model)
,选择以
_set
结尾的属性,这些是后向引用。或者你可以制定一个约定来命名它们。
groups_refs
,搜索以
_refs
结尾的属性。     

要回复问题请先登录注册