#sqlite
#sqlite
Вопрос:
У меня есть база данных pen. Каждое перо (pid) связано с одним брендом (bid) и несколькими тегами (tid). У пера может быть много тегов, а тег может быть связан со многими ручками. У меня есть две таблицы, называемые Pen и Tag. bid — это внешний ключ, хранящийся в таблице Pen. простая таблица отношений «многие ко многим», называемая PenTag. tid и pid — это внешние ключи, хранящиеся в таблице PenTag. Я пытаюсь создать некоторые представления, которые требуют использования таблицы PenTag.
Первый — отфильтровать все ручки и получить те, которые имеют определенный тег (например, получить все ручки, где tid = 3), и отобразить их в виде списка ручек.
Второе представление представляет собой расширенную версию первого, где мне нужно получить список всех ручек с определенным тегом и определенной маркой (например, получить все ручки, где tid = 3 и bid = 2).
Вот изображение моего плана базы данных для пояснения. 1
Я добился второго представления в python, используя sqlalchemy, если это поможет. Прокрутите код вниз, чтобы увидеть мои маршруты.py также.
models.py:
# pen tag joining table
PenTag = db.Table('PenTag', db.Model.metadata,
db.Column('pid', db.Integer, db.ForeignKey('Pen.id')),
db.Column('tid', db.Integer, db.ForeignKey('Tag.id'))
)
# brands
class Brand(db.Model):
__tablename__ = 'Brand'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String, nullable = False)
desc = db.Column(db.Text)
photo = db.Column(db.Text)
deletable = db.Column(db.Boolean)
pens = db.relationship('Pen', backref='brand')
def __str__(self):
return self.name
# pens
class Pen(db.Model):
__tablename__ = "Pen"
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String, nullable = False)
desc = db.Column(db.Text)
photo = db.Column(db.Text)
bid = db.Column(db.Integer,db.ForeignKey('Brand.id'), nullable = False)
tags = db.relationship('Tag', secondary=PenTag, back_populates='pens')
def __str__(self):
return self.name
# tags
class Tag(db.Model):
__tablename__ = "Tag"
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String, nullable = False)
desc = db.Column(db.Text)
photo = db.Column(db.Text)
pens = db.relationship('Pen', secondary=PenTag, back_populates='tags')
def __str__(self):
return self.name```
and in my routes.py, I did the following:
~~~brand = models.Brand.query.filter_by(id = selected_brand).first()
tag = models.Tag.query.filter_by(id = selected_tag).first()
# Get a list of the pens common between the brand and the tag chosen.
results = list(set(brand.pens).intersection(tag.pens))~~~
Ответ №1:
Я нашел ответ с помощью друга.
Решение заключается в использовании внутреннего соединения. Первое представление:
SELECT * FROM PenTag INNER JOIN Pen ON PenTag.pid = Pen.id WHERE PenTag.tid = 3
И второму представлению просто нужно добавить » И Pen.bid = 2″ в самом конце.