我在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的优势。
答案 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并接收模型实例。