把所有的后代都找出来

2024-10-05 14:22:02 发布

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

我使用peewee作为python中的ORM(与postgresql结合使用),并尝试从具有自引用(父子关系)的表中查询给定id的每个子代

实现这一目标的最佳方法是什么?在

编辑:

我已经设置了peewee模型类:

class Customer(BaseModel):
    customerid = PrimaryKeyField()
    name = CharField(null=False)
    parentid = ForeignKeyField(db_column='parentid',
                           null=True,
                           rel_model='self', to_field='customerid')
    customer_type_customertypeid = ForeignKeyField(
        db_column='customer_type_customertypeid',
        null=False,
        rel_model=CustomerType, to_field='customertypeid')

class Meta:
    db_table = 'customer'

现在我想按id查询给定客户的每个子级,并将其转换为dict

^{pr2}$

但是我想不出没有使用CTE就可以实现这一点的查询。但是,既然peewee不支持CTE,我就没办法了。 我确实看到了peewee有一个.raw(..)函数,在这个函数中可以放置真正的sql查询,但这会破坏使用ORM的优势。在


Tags: idfalsedbmodelormcolumncustomernull
2条回答

您可能希望执行递归公共表表达式。Peewee2.x还不支持这个功能,但它是在3.0版本中,因为它有很多变化,而且我还没有完成一些API。对不起的!想把它弄出来。在

不管怎样,你可以用我的模型.raw(“带…”)运行递归CTE并接收模型实例。在

我不完全确定我是否完全理解您要实现的查询,但看起来您确实在定义一个具有循环外键依赖关系的模型。文件对此有一定的说明 Circular Foreign Key Dependencies。建议创建一个中间表来处理对象之间的关系。这可能会使定义查询更加容易。在

另外,Peewee不使用model_to_dict方法,它允许您直接返回dict对象而不是查询对象。尝试类似于:

C1.select(...).where(...).dicts()

相关问题 更多 >