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 также дает результат, Кто-нибудь знает, что я упускаю здесь?

Вернуться на верх