与Django ORM自助​​加入

Sen*_*yai 5 django

我有一个模型:

class Trades(models.Model):  
    userid     = models.PositiveIntegerField(null=True, db_index=True)
    positionid = models.PositiveIntegerField(db_index=True)
    tradeid    = models.PositiveIntegerField(db_index=True)
    orderid    = models.PositiveIntegerField(db_index=True)  
    ...
Run Code Online (Sandbox Code Playgroud)

我想执行下一个查询:

select *
from trades t1
inner join trades t2
ON t2.tradeid = t1.positionid and t1.tradeid = t2.positionid
Run Code Online (Sandbox Code Playgroud)

使用Django ORM可以做到没有黑客的攻击吗?谢谢!

Chr*_*kes 6

select * ... 需要更多的工作。如果您可以从右侧修剪您想要的列

table=SomeModel._meta.db_table
join_column_1=SomeModel._meta.get_field('field1').column
join_column_2=SomeModel._meta.get_field('field2').column
join_queryset=SomeModel.objects.filter()
# Force evaluation of query
querystr=join_queryset.query.__str__()
# Add promote=True and nullable=True for left outer join
rh_alias=join_queryset.query.join((table,table,join_column_1,join_column_2))
# Add the second conditional and columns
join_queryset=join_queryset.extra(select=dict(rhs_col1='%s.%s' % (rhs,join_column_2)),
    where=['%s.%s = %s.%s' % (table,join_column_2,rh_alias,join_column_1)])
Run Code Online (Sandbox Code Playgroud)

添加其他列以供选择 dict 使用。

附加约束放在 ON() 之后的 WHERE 中,您的 SQL 引擎可能对其优化不佳。