Задать вопрос
@greenpower

Как реализовать many-to-many связи с дополнительным полем в SqlAlchemy?

У меня есть рецепты, у которого есть список ингридиентов.
Каждый ингридиент принадлежит какой-то категории ингридиентов.

from app import db

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('recipes.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('product.id'))
)

class Category(db.Model):
    __tablename__ = 'category'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(250), nullable=False)


    def __init__(self, name):
        self.name = name


    def __repr__(self):
        return "Category name %s" % (self.name)


 

class Product(db.Model):
    __tablename__ = 'product'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(250), nullable=False)
    filename = db.Column(db.String(250), nullable=True)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    category = db.relationship(Category)


    def __init__(self, name, filename, category):
        self.name = name
        self.filename = filename
        self.category = category


    def __repr__(self):
        return "Product %s, img %s" % (self.name, self.filename)



class Recipe(db.Model):
    __tablename__ = 'recipes'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(250), nullable=False)
    image = db.Column(db.String(250), nullable=True)
    followed = db.relationship('Product',
        secondary=followers,
        backref=db.backref('followers', lazy='dynamic'),
        lazy='dynamic')


    def follow(self, product):
        if not self.is_following(product):
            self.followed.append(product)
            return self


    def unfollow(self, product):
        if self.is_following(product):
            self.followed.remove(product)
            return self


    def is_following(self, product):
        return self.followed.filter(followers.c.followed_id == product.id).count()


    def followed_products(self):
        return Product.query.join(followers, (followers.c.followed_id == Product.id)).filter(followers.c.follower_id == self.id)


Я хочу хранить еще строку или число, обозначающую количество ингридиента.
Помогите разобраться как это впилить.

Заранее спасибо
  • Вопрос задан
  • 1787 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
zs000
@zs000
Забудьте на время про связь продукта с категорией. У вас это сделано, и это никак не влияет на связь продуктов с рецептами.
Сущность, связывающая рецепты с продуктами, будет состоять из следующих данных:
<id_компонента> <id_продукта> <количество>
(условно, таблица Components)

Теперь, для каждого рецепта собираем набор компонентов в таком виде:
<id_рецепта> <id_компонента>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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