【问题标题】:(Python) - Peewee - How to create a foreign key(Python) - Peewee - 如何创建外键
【发布时间】:2014-08-03 13:36:32
【问题描述】:

我正在尝试通过外键在两个表字段之间创建关系,但由于文档中的示例或 stackoverflow 中的相关线程失败。这是我的代码:

class User(BaseModel):
    """ Field Types """
    user_id = PrimaryKeyField()
    username = CharField(25)
    role = ForeignKeyField(User, to_field='role_id')

    class Meta:
        db_table = 'users'


class User(BaseModel):
    """ Field Types """
    role_id = PrimaryKeyField()
    rolename = CharField(25)

    class Meta:
        db_table = 'roles'

to_field 指的是我的代码 sn-p 中等效表“用户”中的相关字段。在 peewee 的文档中,我看到 related_names 作为参数,它指的是用户模型中不存在的字段推文。

class User(Model):
    name = CharField()

class Tweet(Model):
    user = ForeignKeyField(User, related_name='tweets')
    content = TextField()

希望有人能解释一下这个语法。

【问题讨论】:

    标签: python sql orm foreign-key-relationship peewee


    【解决方案1】:

    我认为您不想拥有 2 个"User" 模型。而tweets 与您的UserRole 架构无关。

    你的意思并不完全清楚,但我认为这样的事情应该可行。

    class Role(BaseModel):
        """ Field Types """
        role_id = PrimaryKeyField()
        rolename = CharField(25)
    
        class Meta:
            db_table = 'roles'
    
    class User(BaseModel):
        """ Field Types """
        user_id = PrimaryKeyField()
        username = CharField(25)
        role = ForeignKeyField(Role, to_field="role_id")
    
        class Meta:
            db_table = 'users'
    

    希望to_field 的含义很明确。它说,User 模型上的role 字段应该指向基于role_id 列的Role 表中的记录。

    相关名称用于反向引用。例如,您可以将它们组合起来,以便访问具有给定角色的所有用户。

    例如,更改您的用户类别:

    class User(BaseModel):
        """ Field Types """
        user_id = PrimaryKeyField()
        username = CharField(25)
        role = ForeignKeyField(Role, to_field="role_id", related_name="users")
    
        class Meta:
            db_table = 'users'
    

    现在,既然您已经发表了自己的意见,“超级用户”角色已加载,您应该能够执行类似的操作来遍历所有具有该角色的用户。

    for user in superuser.users
        print user.username
    

    【讨论】:

    • @user3147268 我已经用使用related_name 的示例更新了我的答案。这有点奇怪,因为它在外键关系的“另一端”添加了一个属性。
    • 我很抱歉出现错误。我为 stackoverflow 创建了一个新的、更小的版本。您的代码的扩展版本适用于我的项目。感谢您的帮助;)
    【解决方案2】:

    会不会是二等用户

    class User(BaseModel):
        """ Field Types """
        role_id = PrimaryKeyField()
        rolename = CharField(25)
    
        class Meta:
            db_table = 'roles'
    

    应该是类角色?

    class Roles(BaseModel):
        """ Field Types """
        role_id = PrimaryKeyField()
        rolename = CharField(25)
    
        class Meta:
            db_table = 'roles'
    

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多