2013-06-04 6 views
5

Für ein ModellWie bekomme ich Spalten/Felder mit peewee Abfrage?

class User(db.Model, BaseUser): 
    name = CharField() 
    phone = CharField() 
    age = IntegerField() 
    points = IntegerField() 

und eine Liste der Felder, lst = ['phone', 'name', 'points']

Gibt es eine Möglichkeit, Ihre Abfrage zu erhalten, die Felder in lst zurückzukehren?

Ich kann kein Beispiel in der docs finden, aber es scheint, als ob Django's ORM etwas wie ...get().values(lst) hat.

Ich habe versucht, die Liste als Argument an User.select() vorbei, aber

TypeError: issubclass() arg 1 must be a class 

bekomme Ich glaube, ich so etwas wie [getattr(obj, field) for field in lst] mit einem resultierenden Objekt tun könnte, scheine aber soll es ein besserer Weg geben?

Aktualisieren: Der Link zu values in Djangos Dokumentation ist here.

Antwort

1

Nicht sicher, was Ihr Problem ist, aber haben Sie versucht, object_list, mit der Verwendung von Kolben-Peewee?

def user_query(): 

    lst_result = User.select().where(User.name == lst.name) 

    return object_list('yourtemplate.html', lst_result, 'list_user') 

Es tut mir leid, wenn nicht viel Hilfe.

Grüße.

+0

Danke, aber es sieht wie folgt aus: Fläschchen Vorlagen ist nicht wahr? (was ich nicht verwende) – beardc

8

können Sie verwenden:

User.select(User.phone, User.name, User.points) 

http://peewee.readthedocs.org/en/latest/peewee/api.html#SelectQuery

+1

Danke, ich habe diesen Weg benutzt (eigentlich etwas wie 'User.select (* [getattr (User, f) für f in lst])') aber fragte sich, ob es ein Möglichkeit, eine Liste von Strings von Feldnamen wie Djangos "values" -Methode direkt zu übergeben. Ich aktualisiere die Frage mit einem Link zu den Dokumenten, auf die ich mich beziehe. – beardc

+0

Btw, ich liebe das ORM :) – beardc

3

Sie verwenden können:

lst = [User.phone, User.name, User.points] 

User.select(*lst) 

Ich benutze diese Methode die Felder dynamisch SELECT aus einer vordefinierten Liste zu wählen.

0

Dies ist ein alter, aber ich habe kürzlich eine Antwort gefunden.

Bei einer Instanz u aus der Tabelle User gibt u._data ein Dictionary mit dem Feldnamen als Schlüssel zurück.

Zum Beispiel:

db.connect() # db was established with connection parameters for your database 
u = User.get() # get one record 
print u._data # get dictionary with field names as keys 
db.close() # free up your connection 
0

Die Lösung hierfür ist tuples oder dicts zu verwenden.

ZB muss für Tupel aus der Dokumentation:

stats = Stat.select(Stat.url, fn.Count(Stat.url)).group_by(Stat.url).tuples() 

# iterate over a list of 2-tuples containing the url and count 
for stat_url, stat_count in stats: 
    print stat_url, stat_count 

ZB muss für dicts aus der Dokumentation:

stats = Stat.select(Stat.url, fn.Count(Stat.url).alias('ct')).group_by(Stat.url).dicts() 

# iterate over a list of 2-tuples containing the url and count 
for stat in stats: 
    print stat['url'], stat['ct'] 

Denken Sie daran, dass die Ergebnisse Iteratoren sind, also wenn Sie wollen die ganze Tupel oder dict im Speicher Sie müssen es mit den Standardmethoden initialisieren: tuple(stats) oder dict(stats).

More info here

Verwandte Themen