Jak se mohu rozhodnout, který deklarativní model instance, na základě informací řádku

hlasů
1

Stavím webapp, která má volitelný Facebook Přihlásit. Uživatelé vytvořené pomocí rozhraní API Facebook jsou řešeny odlišně na několika místech v mé žádosti. Chci zapouzdřit tyto rozdíly v podtřídě Person, která má přednost před metodami.

class Person(Model):
    def get_profile_picture(self):
        return profile_pictures.url(self.picture)

class FacebookPerson(Person):
    def get_profile_picture(self):
        return 'http:/.../%s.jpg' % self.graph_id

Chtěl bych, aby se zabránilo ošklivé if self.graph_ida jen dotaz vzorový osobě a získat ten správný objekt pro každého uživatele.

Přemýšlel jsem o hacking Metaclass přidat FacebookPerson jako základ. Samozřejmě bych rád, aby se zabránilo takové voodoo.

Jsem pomocí baňky a Flask-SQLAlchemy.

Položena 21/06/2011 v 14:42
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Obecnou představu by bylo uložit název třídy v modelu jako metadata v každé řadě, a když instanci objektu, něco takového:

def query(self):
    # stuff
    return model_class(data)

Chcete-li to provést v SQLAlchemy, můžete se podívat na to, aby osoba základní třídy něco jako BasicPerson a FacebookPerson a osobně. init (), použije metadata inicializovat do správné podtřídy.

Například myšlenka by bylo, než když tento dotaz vrátí, uživatel bude byly nastaveny na správné podtřídy:

user = session.query(Person).filter_by(name='james').first()

Pravděpodobně budete muset upravit tento koncept trochu pro SQLAlchemy (Osobně jsem nepoužil to za chvíli), ale to je hlavní myšlenka.

Nebo jsi to mohl udělat něco podobného skladu metadata v souboru cookie s user_id, a pak, když se znovu přihlásit pomocí metadat předat správné třídy do dotazu uživatele:

user = session.query(FacebookPerson).filter_by(name='james').first()

Pokud chcete, že se to být generické takže metatdata je smysluplné pro klienty non-Python, namísto uložení název třídy interního modelu, ukládání tohoto modelu „OBJECT_TYPE“ a mají něco v každém klientském knihovny, která mapuje object_types do tříd.

Odpovězeno 29/06/2011 v 11:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more