如何在使用Peewee连接表时避免覆盖属性?

2024-04-26 07:59:55 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用Peewee连接两个表并从两个同名的表中选择属性时,最后一个表会覆盖其他表。例如,使用以下表格:

 from peewee import *

 db = SqliteDatabase(":memory:")

 class BaseModel(Model):
      class Meta:
           database = db

 class Module(BaseModel):
      name = CharField()

 class Student(BaseModel):
      name = CharField()
      member = ForeignKeyField(Module, related_name="members", null=True)

 db.create_tables([Module, Student], safe=True)

数据如下:

 history_id = Module.create(name="History")
 science_id = Module.create(name="Science")

 Student.create(name="Tim", member=history_id)
 Student.create(name="Mike", member=science_id)

选择如下:

 modules = Module.select(
      Student.name,
      Module.name
 ).join(
      Student,
      on=(Module.id == Student.member)
 ).group_by(Module).dicts()

我得到:

 {'name': 'History'}
 {'name': 'Science'}

或者,如果我在选择中颠倒顺序:

 {'name': 'Tim'}
 {'name': 'Mike'}

Peewee提供了一个解决这个问题的方法吗?你知道吗


Tags: nameidtruedbcreatehistorystudentclass
1条回答
网友
1楼 · 发布于 2024-04-26 07:59:55

刚刚意识到Peewee的alias()可以是used on columns也可以是表:

 modules = Module.select(
      Module.name.alias("module_name"),
      Student.name.alias("student_name")
 ).join(
      Student,
      on=(Module.id == Student.member)
 ).group_by(Module).dicts()

提供:

 SELECT "t1"."name" AS module_name, "t2"."name" AS student_name FROM "module" AS t1 INNER JOIN "student" AS t2 ON ("t1"."id" = "t2"."member_id") GROUP BY "t1"."id", "t1"."name"

以及:

 {'module_name': 'History', 'student_name': 'Tim'}
 {'module_name': 'Science', 'student_name': 'Mike'}

相关问题 更多 >