Мне надо написать связь "многие-ко-многим" используя Flask-SqlAlchemy.
Прошу проверить правильно ли я написал?
О самой задаче:
Есть пользователи и есть файлы, которые они шлют моему веб-приложению. Каждый пользователь может прислать много файлов. Нюанс: может получиться так, что разные пользователи прислали один и тот же файл, тогда мое приложение сохраняет только и только один файл, но в БД должно сохранить информацию об этом файле для каждого, кто слал такой файл.
Какие запросы буду делать к БД?
1. Какие файлы у пользователя?
2. Какие пользователи пользуются этим файлом?
По количеству операций: п.2 будет чаще чем п.1
UPD2:
from .application import db
uploaded_files_users = db.Table('uploaded_files_users',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('uploaded_file_id', db.Integer, db.ForeignKey('uploaded_files.id'))
)
class UploadedFile(db.Model):
__tablename__ = 'uploaded_files'
id = db.Column(db.Integer, primary_key=True)
uuid = db.Column(db.String(36), unique=True, index=True)
md5 = db.Column(db.String(32), unique=True)
filename = db.Column(db.String)
def __init__(self, uuid, md5, filename):
self.uuid = uuid
self.md5 = md5
self.filename = filename
def __repr__(self):
return '<UploadedFile %r, %r>' % (self.filename, self.uuid)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True)
email = db.Column(db.String(), unique=True)
uploaded_files = db.relationship('UploadedFile',
secondary=uploaded_files_users,
backref=db.backref('users', lazy='dynamic'),
lazy='dynamic')
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r, %r>' % (self.username, self.email)
Все верно?
Ответ(2015-04-02). Да этот вариант ОК.
Тесты:
>>> us1 = User('user1', 'user1@mail')
>>> uf1 = UploadedFile('232-3232-3232', '998798798723982318', 'calc.exe')
>>> us1.uploaded_files.append(uf1)
>>> db.session.add(us1)
>>> db.session.commit()
>>> User.query.filter_by(username='user1').first().uploaded_files.all()
[<UploadedFile 'calc.exe', '232-3232-3232'>]
>>> UploadedFile.query.filter_by(filename='calc.exe').first().users.all()
[<User 'user1', 'user1@mail'>]