2013-06-04 18 views
5

dla modeluJak uzyskać kolumny/pola za pomocą zapytania peewee?

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

oraz listę pól, lst = ['phone', 'name', 'points']

Czy istnieje sposób, aby uzyskać zapytanie do powrotu pola w lst?

Nie mogę znaleźć przykładu w docs, ale wygląda na to, że ORM Django ma coś takiego jak ...get().values(lst).

Próbowałem przechodzącą listy jako argument do User.select(), ale dostać

TypeError: issubclass() arg 1 must be a class 

Myślę, że mógłbym zrobić coś takiego [getattr(obj, field) for field in lst] z powstałego obiektu, ale wydaje się, że powinien być lepszy sposób?

Aktualizacja: Łącze do values w dokumentach Django to here.

Odpowiedz

1

Nie jesteś pewien, jaki jest twój problem, ale czy próbowałeś użyć object_list, używając flask-peewee?

def user_query(): 

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

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

Przykro mi, jeśli nie pomogę.

Pozdrawiam.

+0

Dzięki, ale wygląda na to, że nie ma szablonów Flask? (którego nie używam) – beardc

8

Można użyć:

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

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

+1

Dzięki, używałem w ten sposób (właściwie coś w rodzaju 'User.select (* [getattr (User, f) dla f in lst])') ale zastanawiałem się, czy istnieje sposób bezpośredniego przekazania listy łańcuchów nazw pól, takich jak metoda "wartości" Django. Zaktualizuję pytanie linkiem do dokumentów, do których się odnawiam. – beardc

+0

Btw, kocham ORM :) – beardc

3

Można użyć:

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

User.select(*lst) 

użyć tej metody, aby wybrać pola dynamicznie SELECT z predefiniowanej listy.

0

To jest stary, ale ostatnio znalazłem odpowiedź.

Biorąc instancję u z tabeli Użytkownik, to u._data zwraca słownik z nazwą pola jako kluczem.

Na przykład

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

Rozwiązaniem jest użycie tuples lub dicts.

np krotek z docs:

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 

np dicts Od docs:

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

Pamiętaj, że wyniki są iteratory, więc jeśli chcesz cały krotka lub dict w pamięci należy go zainicjować metodami domyślnymi: tuple(stats) lub dict(stats).

More info here

Powiązane problemy