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') 

這是我需要做的一個簡化例子,但應該很好地捕捉它......我需要Company能夠將自己表達爲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"} 

因此屬性()包括實體的屬性如預期,但我也希望包括背來自關聯對象的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

唯一性檢查僅僅是針對類dict(即爲類對象的名稱和值之間提供映射的內部對象)。你可以通過檢查Company.__dict__來重複這些。這包括了所有內容 - Python object中構建的所有屬性,屬性和方法,同樣適用於db.Model和任何其他父類。

你最好的辦法是遍歷類字典,檢查每一項,看它是否的_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). 
0

讓我們假設你不賦值collection_name,只是把它作爲Modelname_set。然後你可以dir(model),選擇以_set結尾的屬性,那些是反向引用。或者你可以制定一個約定來命名它們。 groups_refs,並搜索以_refs結尾的屬性。