Django ORM-强制转换并过滤查询集

Django ORM-强制转换并过滤查询集,django,django-orm,Django,Django Orm,我想将一个相关列强制转换为integer,然后过滤查询集,但我无法让它工作。这些是我的模型 class Author(models.Model): name = models.CharField(max_length=255) ... class Book(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Author, on_delete=mo

我想将一个相关列强制转换为integer,然后过滤查询集,但我无法让它工作。这些是我的模型

class Author(models.Model):
    name = models.CharField(max_length=255)
    ...


class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    ...


class MetricType(models.Model):
    label = models.CharField(max_length=255)


class Metrics(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name="metrics")
    metric_type = models.ForeignKey(MetricType, on_delete=models.CASCADE)
    value = models.CharField(max_length=255)
为了简单起见,假设我有以下数据。(这个例子过于简单,但问题是一样的)

现在,我唯一想做的就是得到所有超过N页的书。这在正常情况下很容易做到,但在这种情况下,我需要转换度量值,然后进行筛选。我尝试了以下方法:

from django.db.models import IntegerField
from django.db.models.functions import Cast
from . import models

value = 50

pages_metric = models.MetricType.objects.get(label='Pages')

models.Book.objects.annotate(
    pages=Cast('metrics__value', IntegerField()
).filter(
    metrics__metric_type=pages_metric, pages__gte=value
)
我想买一本书,一本有100页的书,但我却犯了一个严重的错误:

(1055, "Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXXXX' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")

我没有权限修改MySQL服务器设置,目前无法修改数据库架构,因为这是一个遗留数据库。我可以在Django中做些什么来实现这一点吗?

为什么不先将值存储为整数?@Dalvtor或者您可能需要编辑您的问题,以明确这是一个遗留数据库,您不能更改模式-因为我的第一反应也是写“去掉这个‘指标’的东西,只存储页面计数(作为int)作为本书的一部分”;-)是的,那会让事情变得更容易:D.我会编辑question@Dalvtor谢谢;-)-FWIW,在最坏的情况下(或者如果您急于交付,但可以稍后再来),Django的ORM也允许您使用简单的SQL查询。不一定是“最干净”的解决方案,但在查询对于ORM变得太复杂或旧模式与ORM的某些限制不匹配时仍然非常有用。请记住,此ORM被设计为“80/20”解决方案-使最常见的用例(80%)尽可能简单,同时即使不太优雅,仍能处理剩余的角落用例(20%)。@Dalvtor也许这会有所帮助,似乎其他人在强制转换值并基于这些强制转换执行联接时遇到了意外的查询:为什么最初不将值存储为整数?@Dalvtor您可能需要编辑您的问题,以明确它是一个遗留数据库,并且您无法更改模式-因为我的第一反应也是编写“摆脱这个‘指标’的东西,把页数(int)作为书的一部分存储起来”;-)是的,这会让事情变得更容易:D。我会编辑question@Dalvtor谢谢;-)-FWIW,在最坏的情况下(或者如果您急于交付,但可以稍后再来),Django的ORM也允许您使用普通SQL查询。不一定是““最干净”的解决方案,但当您的查询对于ORM变得太复杂或您的旧模式与ORM的某些限制不匹配时,仍然非常有用。请记住,此ORM设计为“80/20”解决方案-对于最常见的用例(80%)使事情尽可能简单虽然仍然能够处理剩余的角情况(20%),即使不那么优雅。@Dalvtor这可能会有所帮助,但似乎其他人在强制转换值并基于这些强制转换执行联接时遇到了意外的查询:
(1055, "Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXXXX' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")