提交用户列表的SQLAlchemy

时间:2014-01-25 14:39:29

标签: python sqlalchemy relationship flask-sqlalchemy

我有一个模型是用户,其中此模型中有一个字段,我想存储用户列表。这个想法是你可以添加炒菜并将它们存放在某个地方。

class User (db.Model):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique = True)
    email = Column(String(120), unique = True)
    password = Column(String(50))
    date = Column(DateTime(), default=datetime.now())
    friends = "Should be a list of users"

我曾想过有一个字符串,其中包含每个用户的id,但是,是否有任何可能与同一模型的关系?像这样:

friends = relationship("User")

非常感谢!

3 个答案:

答案 0 :(得分:2)

基于Adjacency List Relationships的建议解决方案仅适用于某人可以成为最多一个人的朋友的情况,我认为不是现实世界中的情况。

在这种情况下,您需要应用的模式称为Self-Referential Many-to-Many Relationship。请阅读上面链接的示例。为了使其适用于您的模型,您需要创建其他表以保持朋友对,并按如下方式配置关系:

# object model
t_userfriend = Table("user_friend", Base.metadata,
    Column("user_id", Integer, ForeignKey("users.id"), primary_key = True),
    Column("friend_id", Integer, ForeignKey("users.id"), primary_key = True),
)

class User (Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String(50), unique = True)
    # ...
    friends = relationship("User",
                          secondary = t_userfriend,
                          primaryjoin = (id == t_userfriend.c.user_id),
                          secondaryjoin = (id == t_userfriend.c.friend_id),
                          backref = "friend_of",
                          )

我想你需要问的另一个问题是,在你的模型中,如果A是B的朋友,这是否意味着B是A的朋友?如果这是真的,您可能需要/需要:

  1. 要么只存储关系的一面,要么计算另一面
  2. 确保始终将双方都存储在关系中

答案 1 :(得分:1)

您可以使用邻接列表关系,此链接也有同样的问题,您可以从中学习。 How to create relationship many to many in SQLAlchemy (python, flask) for model User to itself

答案 2 :(得分:0)

是的,您可以使用Adjacency List Relationships

class User (db.Model):

    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique = True)
    email = Column(String(120), unique = True)
    password = Column(String(50))
    date = Column(DateTime(), default=datetime.now())
    friends = relationship("User",
            backref=backref('parent', remote_side=[id])
        )