Peewee得到了所有的后代

时间:2016-11-17 11:06:35

标签: python postgresql orm peewee

我在python中使用peewee作为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

C1 = dbhandler.Customer.alias()

try:
    return [model_to_dict(model) for model in
        C1.select().where(...)]
except:
     return {}

但我无法想到一个可以在不使用CTE的情况下实现这一目标的查询。但由于小便并不支持CTE,我的想法不合理。 我确实看到peewee有一个.raw(..)函数,你可以在其中放入真正的sql查询,但这会破坏使用ORM的优势。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您可能希望执行递归公用表表达式。 Peewee 2.x不支持这个,但是它在3.0中,目前未发布,因为它有很多变化,我还没有最终确定一些API。抱歉!试图解决这个问题。

无论如何,您可以使用MyModel.raw('WITH ...')来运行递归CTE并接收模型实例。