2

このシナリオでは、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文字列として自分自身を表現できるようにする必要があります.Companyは他のクラス(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>"
}

私は実際には逆参照「オフィス」と「地域」を properties() 列挙に含める必要はありませんが、何らかの方法で一意性をチェックしています (たとえば、Company に StringProperty を含めることもできませんでした)。 'offices' という名前) であるため、それらを列挙する方法が必要です。誰でも方法を知っていますか?

4

2 に答える 2

1

一意性のチェックは、単にクラス 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).
于 2011-04-04T07:04:26.673 に答える
0

に値を割り当てずcollection_name、そのままにしておくとしModelname_setます。次にdir(model)、 で終わる属性を選択する_setと、それらが後方参照になります。または、それらに名前を付けるための規則を作成することもできます。groups_refs、で終わる属性を検索します_refs

于 2012-03-20T19:12:51.817 に答える