2017-07-31 78 views
-1

我想創建一個像這樣的自我關係的表...如何創建表,在燒瓶SQL鍊金術

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) 

請不要猶豫,給出產品進行分類和職位表一個更好的解決方案。

+0

我不喜歡擺在首位表:P 所謂的**外鍵**指向同一個表。不知道你爲什麼這樣做 – Nabin

+0

@Nabin嗨,我想在我的數據庫中創建動態分類系統。當用戶想要創建一個新類別並指向其父類時,他可以使用此表。 –

+0

您可以從此答案中退出。 [sqlalchemy自引用表](https://stackoverflow.com/questions/2638217/sqlalchemy-mapping-self-referential-relationship-as-one-to-many-claclarative-f) – ionheart

回答

0

對於自我引用,您必須使用與remote_side參數的關係來支持多對一關係。

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

你可以在這裏閱讀更多:enter link description here

+0

in flask-sqlalchemy它更好寫'parent_id = db.Column(db.Integer,db.ForeignKey('product_group.id'))'創建列,然後在它們之間創建關係parent = db。關係(「ProductGroup」,remote_side = [id])' –

+0

我創建了我的表格,但是在加載我父母的孩子時想要將孩子加載到我的表格中時遇到問題。我用'parent = db.relationship('ProductCategory',remote_side = [id],uselist = False,backref ='childs')'但是我怎樣才能訪問jinja的父屬性? –

-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>]

這是你想要的嗎?

順便說一句,如果你定義的product_groupgroup屬性如下,

group = db.relationship("ProductGroup", primaryjoin="ProductGroup.id==ProductGroup.parent_id", foreign_keys='ProductGroup.id', uselist=False) 

您將獲得價值對象不是數組。