peewee:当 back-referencing 外键时获取单个模型而不是 SelectQuery
peewee: Get a single model instead of SelectQuery when back-referencing a foreign key
我对 peewee
中的 back-referencing 外键有点费劲。
考虑以下代码:
import peewee as pw
db = pw.SqliteDatabase(':memory:')
class Parent(pw.Model):
name = pw.CharField()
class Meta:
database = db
class Child(pw.Model):
name = pw.CharField()
parent = pw.ForeignKeyField(Parent, related_name="kid")
class Meta:
database = db
db.create_tables([Parent, Child])
bob = Parent.create(name="Bob")
alice = Child.create(name="Alice", parent=bob)
可以使用 bob.kid
访问 Bob 的 children,这会给我一个 SelectQuery
。然而,根据设计,我知道任何 Parent
只能有一个 Child
。然后可以使用 bob.kid[0]
.
访问 child
我希望能够通过简单地调用 bob.kid
而不是 bob.kid[0]
从 Parent
访问 Child
。如果不进一步修改Parent
class,这可以实现吗?
您可以只添加一个 属性。
默认反向引用为 0..N
,因此最好用 select 查询表示。
示例:
class Parent(pw.Model):
name = pw.CharField()
class Meta:
database = db
@property
def kid(self):
return self.children.get()
class Child(pw.Model):
name = pw.CharField()
parent = pw.ForeignKeyField(Parent, related_name="children")
class Meta:
database = db
提示:
如果外键确实是一对一的,您可以在外键上添加 UNIQUE
约束。
我对 peewee
中的 back-referencing 外键有点费劲。
考虑以下代码:
import peewee as pw
db = pw.SqliteDatabase(':memory:')
class Parent(pw.Model):
name = pw.CharField()
class Meta:
database = db
class Child(pw.Model):
name = pw.CharField()
parent = pw.ForeignKeyField(Parent, related_name="kid")
class Meta:
database = db
db.create_tables([Parent, Child])
bob = Parent.create(name="Bob")
alice = Child.create(name="Alice", parent=bob)
可以使用 bob.kid
访问 Bob 的 children,这会给我一个 SelectQuery
。然而,根据设计,我知道任何 Parent
只能有一个 Child
。然后可以使用 bob.kid[0]
.
我希望能够通过简单地调用 bob.kid
而不是 bob.kid[0]
从 Parent
访问 Child
。如果不进一步修改Parent
class,这可以实现吗?
您可以只添加一个 属性。
默认反向引用为 0..N
,因此最好用 select 查询表示。
示例:
class Parent(pw.Model):
name = pw.CharField()
class Meta:
database = db
@property
def kid(self):
return self.children.get()
class Child(pw.Model):
name = pw.CharField()
parent = pw.ForeignKeyField(Parent, related_name="children")
class Meta:
database = db
提示:
如果外键确实是一对一的,您可以在外键上添加 UNIQUE
约束。