Mam następujący model, gdzie różne teksty są oznaczone do różnych kolekcji tekstów, a każdy tekst może mieć kilka wersji, ale tylko jedna "aktywna" wersja:

class Collection(db.Model):
    name = db.StringProperty()
    ...       

class Text(db.Model):
    title = db.StringProperty(default="Untitled")
    ...

class Version(db.Model):
    text = db.ReferenceProperty(Text, collection_name="versions")
    content = db.TextProperty()
    active = db.BooleanProperty(default=True)
    ...

class Tag(db.Model):
    collection = db.ReferenceProperty(Collection, collection_name="c_tags")
    text = db.ReferenceProperty(Text, collection_name="t_tags")

Teraz chciałbym wyświetlić wszystkie "aktywne" teksty w jednej kolekcji:

class ViewCollection(webapp.RequestHandler):
    def(get):
        collection = Collection.get(self.request.get("key"))
        # grabs the collection to display
        tags = collection.t_tags
        # grabs all the tags linking a text and a collection
        texts = [t.text for t in tags]

Daje mi to listę wszystkich tekstów, więc mogę łatwo wydrukować wszystkie tytuły tekstowe (t.title for t in texts), ale czy jest jakiś sprytny sposób, jaki mogę teraz złapać odpowiednią "aktywną" wersję każdego tekstu?

Czy jest to rodzaj filtrowania na różnych klasach modelowych niemożliwe?

0
user1612947 23 sierpień 2012, 06:43

2 odpowiedzi

Najlepsza odpowiedź

Musisz wydać kolejne zapytanie na obiekty w wersji, gdzie tekst == t.text i aktywny == true.

W zależności od przypadku użycia może warto denormalizować i przechowywać najnowszą wersję w tagu, więc nie potrzebujesz dodatkowych zapytań, aby uzyskać dane. Ta denormalizacja jest wspólną "optymalizacją" dla NOBL DATASTORES.

1
dragonx 23 sierpień 2012, 15:09

Datastore aplikacji APP nie jest przeznaczony dla tego rodzaju problemów algebry relacyjnych. Nie wierzę, że ze swoim obecnym projektem można to zrobić skutecznie. Proponuję przeczytać na koncepcje bazy danych NOSQL i przeprojektować modele, aby były "mniej relacyjne".

1
Mikołaj Siedlarek 23 sierpień 2012, 06:38