Django ORM в строке запроса рассматривает значение выбора модели как колонку
У меня есть следующий код Django ORM, и происходит что-то странное.
Когда я комментирую часть if для library_level, запрос работает нормально. Если я добавляю любое новое выражение Q, то значение, предоставленное как Q(field=value), рассматривается как другое поле.
query = (
(Q(domains=[]) | Q(domains__contains=domain)) # rule matches domain
& (Q(klass=[]) | Q(klass__contains=dom_class)) # rule matches class
& (Q(standards__contains=cdisc_version)) # rule matches standards
& (~Q(exclusions__contains=domain)) # domain is not in excluded list
& (~Q(exclusions__contains=dom_class)) # dom_class is not in excluded list
)
if not library_level:
query &= ~Q(rule_type=DataCheckRuleType.DATASET_CHECK)
required_checks = DataCheckRule.objects.filter(query).values(
"rule_id",
"domains",
"message",
"description",
"exclusions",
"klass",
"standards",
"detail_string",
"ex_domains",
"rule_type",
"params",
)
sql_query = str(required_checks.query)
Печать приведенного выше sql_query дает
SELECT "datacheck_rules"."rule_id", "datacheck_rules"."domains", "datacheck_rules"."message", "datacheck_rules"."description", "datacheck_rules"."exclusions", "datacheck_rules"."klass", "datacheck_rules"."standards", "datacheck_rules"."detail_string", "datacheck_rules"."ex_domains", "datacheck_rules"."rule_type", "datacheck_rules"."params" FROM "datacheck_rules" WHERE (("datacheck_rules"."domains" = \'[]\' OR "datacheck_rules"."domains" @> \'"DATA"\') AND ("datacheck_rules"."klass" = \'[]\' OR "datacheck_rules"."klass" @> \'"UNKNOWN"\') AND "datacheck_rules"."standards" @> \'"SDTMIG 3.2"\' AND NOT ("datacheck_rules"."exclusions" @> \'"DATA"\') AND NOT ("datacheck_rules"."exclusions" @> \'"UNKNOWN"\') AND NOT ("datacheck_rules"."rule_type" = dataset_check))
Вы видите, что 'dataset_check' рассматривается как столбец, а не строка, что приводит к ошибке, упомянутый столбец не существует.
Я создаю sql_query для использования в качестве
relevant_checks = pd.read_sql(sql_query, connections["default"])
Мой DataCheckRuleType имеет вид
class DataCheckRuleType(models.Choices):
DATASET_CHECK = "dataset_check"
Моя модель
class BaseModel(models.Model):
class Meta:
abstract = True
rule_type = models.CharField(max_length=20, choices=DataCheckRuleType.choices)
class DataCheckRule(BaseModel):
domains = models.JSONField(default=list)
exclusions = models.JSONField(default=list)
klass = models.JSONField(default=list)
standards = models.JSONField(default=list)
ex_domains = models.JSONField(default=list)
Значения, которые вы видите в фильтре ORM, поступают через полезную нагрузку API.
Я думаю, что мой код в порядке, и комментирование if также дает результат, Кто-нибудь знает, что я упускаю здесь?