EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Правильно ли написал многие-ко-многим в терминах Flask-SqlAlchemy?

Мне надо написать связь "многие-ко-многим" используя 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'>]
  • Вопрос задан
  • 2375 просмотров
Решения вопроса 1
@sormon
инженер-программист =)
Нужно убрать либо у UploadedFile, либо у User определитель отношения, если вы используете backref, поскольку backref как раз определяет имя поля этого класса для связываемой сущности, и он там и так будет доступен.
По частоте, тут нет особой разницы, все равно, при указании backref, у обеих сущностей будет доступ к связанным с ней записям.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Andrew_Lvov
@Andrew_Lvov
backref - это имя, по которому вы можете получить список соотв. обьектов в обратную сторону.
В случая поля uploaded_files backref - это название атррибута, по которому вернётся список ассоциированных с данным uploaded_file юзверей, то есть адекватно указать backref='users'.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы