2015-05-04 2 views
0

Новое в SQLalchemy, sql-запросы в целом, но, надеюсь, это будет ясно кому-то :) В приложении Flask у меня есть две модели, Пользователь и классы, во многих отношенияхSQLAlchemy: проблема с запросом во многих отношениях

Вот models.py

user_to_classes = db.Table('user_to_classes', Base.metadata, 
db.Column('class_id', db.Integer, db.ForeignKey('classes.id')), 
db.Column('user_id', db.Integer, db.ForeignKey('users.id')) 
) 



class Classes(db.Model): 
    __tablename__= 'classes' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(64)) 
    date = db.Column(db.DateTime) 
    participants = db.relationship('User', secondary=user_to_classes, backref = db.backref('classes',lazy='dynamic')) 
    classtype_id = db.Column(db.Integer, db.ForeignKey('classtype.id')) 
    status = db.Column(db.Integer) #1 = open, 0 = closed 

class User(UserMixin,db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(64), unique=True, index=True) 
    email = db.Column(db.String(64),unique=True,index=True) 
    firstname = db.Column(db.String(64)) 
    lastname = db.Column(db.String(64)) 
    fullname = db.Column(db.String(64), index=True) 
    telephone = db.Column(db.String(64)) 
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) 
    password_hash = db.Column(db.String(128)) 
    member_since = db.Column(db.DateTime(), default=datetime.utcnow) 
    last_seen = db.Column(db.DateTime(), default=datetime.utcnow) 
    notes = db.Column(db.Text()) 
    punchcard_passes = db.Column(db.Integer) 

Я пытаюсь узнать, как много классов посещал пользователь. У меня нет проблем с запросом, сколько пользователей участвовало в классе, но не наоборот, поскольку в пользовательской модели нет значения для запроса. Возможно ли это? Не будучи уверенным в SQL-запросах, я не уверен, что искать в Google. Все примеры, которые я видел, делают односторонний запрос, и никогда другой.

спасибо!

ответ

2

Как насчет len(user.classes)? Разве это не работает?

Кроме того: не называйте класс во множественном числе, так как объект его представляет только один класс.

+0

Нет, это говорит TypeError: объект типа «AppenderBaseQuery» не имеет LEN() И да, я сделал много ошибок новичка в моих имен переменных до сих пор. Но я боюсь рефрактора, потому что он, вероятно, сломает тонны звонков. – Kinwolf

+0

Я идиот. Мне никогда не приходило в голову, что мне нужно только объявить отношения в модели User. Я добавил db.relationship ('Classes', secondary = user_to_classes, backref = db.backref ('users', lazy = 'dynamic')), и теперь я могу сделать простую len (user.classes) , Спасибо, что поставил меня на правильный путь! – Kinwolf

+0

На самом деле, вам это не нужно. Вот для чего нужен backref, прочитайте документы здесь: http://docs.sqlalchemy.org/en/latest/orm/backref.html Итак, вам нужно объявить «многие ко многим» только в одном из них. –

Смежные вопросы