Как перечислить обратные ссылки на сущность - PullRequest
2 голосов
/ 04 апреля 2011

В этом сценарии 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 и Регион), которые ссылаются на него. Это работает для нормальных свойств:

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 (), но они как-то проверяются на уникальность (я не мог, например, также есть StringProperty в компании с именем «офисы»), поэтому должен быть способ перечислить их. Кто-нибудь знает способ?

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Проверка на уникальность просто в отношении класса 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).
0 голосов
/ 20 марта 2012

Предположим, вы не присваиваете значения collection_name, просто оставьте его как Modelname_set.Затем вы можете dir(model), выбрать атрибуты, заканчивающиеся на _set, и это обратные ссылки.Или вы можете сделать соглашение, чтобы назвать их, например.groups_refs и поиск атрибутов, заканчивающихся на _refs.

...