如何在 Django ORM 的过滤器中使用变量列名?
How to use variable column name in filter in Django ORM?
我有两个表 BloodBank(id, name, phone, address) 和 BloodStock(id, a_pos, b_pos, a_neg, b_neg, bloodbank_id).我想从两个表中获取所有列,其中变量列名(比如血型)的值类似于 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)
这将为您提供 Bloodbank 对象,这些对象具有相关的血统,其血型中的值大于零,由 blood 变量表示。
请注意,我写这篇文章的方式,您不会选择纯血列,您可能会得到重复的血库。如果您想消除重复的血库,您可以将 .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()
。
我有两个表 BloodBank(id, name, phone, address) 和 BloodStock(id, a_pos, b_pos, a_neg, b_neg, bloodbank_id).我想从两个表中获取所有列,其中变量列名(比如血型)的值类似于 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)
这将为您提供 Bloodbank 对象,这些对象具有相关的血统,其血型中的值大于零,由 blood 变量表示。
请注意,我写这篇文章的方式,您不会选择纯血列,您可能会得到重复的血库。如果您想消除重复的血库,您可以将 .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()
。