Python Django相当于MySQL中的,并按模型的字段进行过滤
我有两张桌子:Python Django相当于MySQL中的,并按模型的字段进行过滤,python,mysql,django,django-models,orm,Python,Mysql,Django,Django Models,Orm,我有两张桌子: table1 ----------------- | id | salary | | 1 | 2500 | | 2 | 500 | ----------------- table2 ------------------------------- | id | outlay | table1_fk | | 1 | 20 | 1 | | 2 | 40 |
table1
-----------------
| id | salary |
| 1 | 2500 |
| 2 | 500 |
-----------------
table2
-------------------------------
| id | outlay | table1_fk |
| 1 | 20 | 1 |
| 2 | 40 | 1 |
| 3 | 1000 | 2 |
-------------------------------
我需要从表1+支出总额中选择所有行,其中工资大于支出总额
MySQL查询将是:
选择t1.*,合并支出2.支出,0作为总支出
从表1中取t1
将表2作为t2在t1.id=t2.table1上左连接
按t1.id分组
总支出<1.工资;
Django ORM有可能吗?到目前为止,我有:
Model1.objects.filtersomefilterlogic.annotateoutlay_total=Summodel2__支出
我正在使用Django 2.2.5和MySQL您可以在该子句之后:
这回答了你的问题吗?这就是我需要的,我错过了F函数。此外,我还修改了注释,使其与MySQL查询模型1.objects.filtersomefilterlogic.annotateoutlay_total=CoalesceSummodel2_uuu支出,0.filter total_支出uuu lt=F'salary'完全对应
from django.db.models import F, Sum
Model1.objects.filter(
somefilterlogic
).annotate(
outlay_total=Sum('model2__outlay')
).filter(
total_outlay__lt=F('salary')
)
from django.db.models import F, Sum
from django.db.models.functions import Coalesce
Model1.objects.filter(
somefilterlogic
).annotate(
outlay_total=Coalesce(Sum('model2__outlay'), 0)
).filter(
total_outlay__lt=F('salary')
)