如何在 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()