(Python) - Peewee - 如何创建外键

use*_*268 4 python sql orm foreign-key-relationship peewee

我试图通过外键在两个表字段之间创建关系,但在文档或 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'
Run Code Online (Sandbox Code Playgroud)

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

class User(Model):
    name = CharField()

class Tweet(Model):
    user = ForeignKeyField(User, related_name='tweets')
    content = TextField()
Run Code Online (Sandbox Code Playgroud)

希望有人可以解释这个语法。

std*_*err 5

我不认为你想要有 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'
Run Code Online (Sandbox Code Playgroud)

希望 的含义to_field是清楚的。它表示,模型role上的字段应根据列指向表User中的记录。Rolerole_id

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

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

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'
Run Code Online (Sandbox Code Playgroud)

现在,假设您已经说了,已加载“超级用户”角色,您应该能够执行类似的操作来循环具有该角色的所有用户。

for user in superuser.users
    print user.username
Run Code Online (Sandbox Code Playgroud)