我有两个表BloodBank(id,name,phone,address(和BloodStock(id,a_pos,b_pos,a_neg,b_neg,BloodBank_id(。我想从两个表中获取所有列,其中变量列名(比如bloodgroup(的值为a_pos或a_neg。。。并且它们的值应该大于0。我如何为相同的内容编写ORM?
SQL查询是这样编写的,以获得所需的结果。
sql="select * from public.bloodbank_bloodbank as bb, public.bloodbank_bloodstock as bs where bs."+blood+">0 and bb.id=bs.bloodbank_id order by bs."+blood+" desc;"
cursor = connection.cursor()
cursor.execute(sql)
bloodbanks = cursor.fetchall()
您的问题可以更具体,但我相信您有一个名为blood
的变量,它包含列的字符串名称,并且列a_pos、b_pos等都是数字。
您可以使用字典从字符串创建关键字参数:
filter_dict = {bloodstock__blood + '__gt': 0}
bloodbanks = Bloodbank.objects.filter(**filter_dict)
这将为您获得血库对象,这些对象在由血液变量表示的血型中具有大于零值的相关血库。
注意,按照我写这篇文章的方式,你不会选择血库列,你可能会得到重复的血库。如果你想消除重复的血库,你可以将.distinct()
添加到你的查询中。血库可用于使用.bloodstock_set.all()
的每个血库实例。
ORM将使用联接生成SQL。或者,您可以在where子句中执行EXISTS,而不执行联接。
from django.db.models import Exists, OuterRef
filter_dict = {blood + '__gt': 0}
exists = Exists(Bloodstock.objects.filter(
bloodbank_id=OuterRef('id'),
**filter_dict
)
bloodbanks = Bloodbank.objects.filter(exists)
在这种情况下将不需要.distinct()
。