如何创建具有自我关系的表,以便在flask SQL Alchemy中对产品进行分类

时间:2017-07-31 09:41:13

标签: python sqlalchemy

我想创建一个像这样的自我关系表...

group_id | title  | parent_id
-------- | -----  | ---------
   1     |mobile  |   null
   2     |Sony    |    1
   3     |Samsung |    1
   4     |Laptop  |   null
   5     |ASUS    |    4
   6     |Dell    |    4

因此 group_id 是表格的主键,而parent_id是外键。我该如何修改此类 Flask SQL Alchemy

class ProductGroup(db.Model):
    __tablename__ = "product_group"

    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(150), unique = True)
    parent_id = db.Column(db.Integer)

    def __init__(self, title, parent_id):
        self.title = title
        self.parent_id = parent_id


    def __repr__(self):

        return '<ProductGroup: {}>'.format(self.title)

另外,我如何给出这个表和我的产品表的关系?以下是我的产品表。我想为这个表创建类别表。

class Product(db.Model):
    """
        Create Product Table
    """
    __tablename__ = 'products'

    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = True)
    summary = db.Column(db.String(512))
    features = db.Column(db.String(256))
    description = db.Column(db.String(1024))
    thumbnail = db.Column(db.String(128))
    picture = db.Column(db.String(128))
    video = db.Column(db.String(128))

    def __init__(self, name, summary, features, description, thumbnail, picture, video):
        self.name = name
        self.summary = summary
        self.features = features
        self.description = description
        self.thumbnail = thumbnail
        self.picture = picture
        self.video = video

    def __repr__(self):
        return '<Product: {}>'.format(self.name)
  

请不要犹豫,为分类产品和帖子表提供更好的解决方案。

2 个答案:

答案 0 :(得分:0)

对于自引用,您必须使用与remote_side参数的关系来支持多对一关系。

parent_id = relationship("ProductGroup", remote_side=[id])

您可以在此处阅读更多内容:enter link description here

答案 1 :(得分:-1)

首先,请将您的product_group表格中的数据库记录设置如下。

enter image description here

并且,请按照以下方式修改您的代码。

class ProductGroup(db.Model):
    __tablename__ = "product_group"

    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(150), unique = True)
    parent_id = db.Column(db.Integer)
    group = db.relationship("ProductGroup", primaryjoin="ProductGroup.id==ProductGroup.parent_id", foreign_keys='ProductGroup.id')


    def __init__(self, title, parent_id):
        self.title = title
        self.parent_id = parent_id


    def __repr__(self):

        return '<ProductGroup: {}>'.format(self.title)

并且,您可以按如下方式访问group属性。

product_group = ProductGroup.query.get(2)
print(product_group.group)

你会得到

[<ProductGroup: mobile>]

这是你想要的吗?

顺便提一下,如果您定义group的{​​{1}}属性如下,

product_group

你将获得作为对象而非数组的价值。