如何在Django ORM中使用过滤器中的变量列名



我有两个表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()

最新更新