我的头撞到了这个上面:

我有2个模型,我正在试图设计一个自定义管理器/查询集,将允许我注释到每个Seriesid个链接的谜题满足格式'2,13,26'的某些条件.

简化的模型:

class Series(models.Model):
    puzzles = models.ManyToManyField(
        Puzzle, through='SeriesElement', related_name='series')
    is_public = models.BooleanField(null=False, blank=False, default=False)

class Puzzle(models.Model):
    pass

我的定制聚合器:

from django.db.models.aggregates import Aggregate
from django.db.models.functions import Coalesce
from django.db.models.fields import CharField
from django.db.models.expressions import Value

class GroupConcat(Aggregate):
    """
    according to https://stackoverflow.com/questions/10340684/group-concat-equivalent-in-django
    according to https://stackoverflow.com/a/55216659
    would be compatible with MySQL and SQLite
    """
    function = 'GROUP_CONCAT'

    def __init__(self, expression, distinct=False, ordering=None, **extra):
        super(GroupConcat, self).__init__(expression,
                                          distinct='DISTINCT ' if distinct else '',
                                          ordering=' ORDER BY %s' % ordering if ordering is not None else '',
                                          output_field=CharField(),
                                          **extra)


    def as_sqlite(self, compiler, connection, **extra):
        return super().as_sql(compiler,
                              connection, 
                              template='%(function)s(%(distinct)s%(expressions)s%(ordering)s)',
                              **extra)

一个实现我目标的试探性方法:

pzl_sub = apps.get_model('puzzles', 'Puzzle').objects.filter(series__id= OuterRef('id'))
pzl_sub = pzl_sub.filter(series_elements__isnull=False).add_nb_public_series().filter(nb_public_series=5)
pzl_ids= pzl_sub.order_by().values('id')
qs = Series.objects.annotate(id_str_pzl = GroupConcat(pzl_ids))

我只获得了一个符合指定条件的publle.id,而不是所有符合条件的publle.id的集合

有线索知道我做错了什么吗?

推荐答案

经过几天的斗争和测试,我终于弄明白了:

pzl_sub = apps.get_model('puzzles', 'Puzzle').objects.filter(series__id= OuterRef('id'))
pzl_sub = pzl_sub.filter(series_elements__isnull=False).add_nb_public_series().filter(nb_public_series=5)
pzl_ids= pzl_sub.order_by().values('series__id')
qs = Series.objects.annotate(id_str_pzl = Subquery(pzl_ids.annotate(result=GroupConcat('id')).order_by().values('result')))

pzl_ids人中,我们需要挑选values('series__id')

在第二步中,我们需要使用聚合器进行注释,并再次挑选出结果值……

Django相关问答推荐

构造一个定制字符串(实体、年份和字母数字的组合)作为Django中的Postgres数据库的主键是否明智?

Django:我的上下文变量不能用于重复的for循环

在Python中向函数的查询列表添加条件

只从查询集中获取某种类型的最新项目

Django:创建一个动态侧边栏模板并在其他模板中使用它

表单集中的每个表单验证

组织大型 Django 元素的指南

DeleteView 中的success_message 未显示

Django 从字段开始

删除所有表的django命令是什么?

无效的命令 WSGIDaemonProcess 在 CentOS 6.7 上部署 Django 应用程序

URL命名空间的一个真实例子

Django:获取上次用户访问日期

如何使用基于类的视图处理表单(通过 get 或 post)?

Django:如何过滤属于特定组的用户

Django 应用程序运行良好,但收到 TEMPLATE_* 警告消息

RemovedInDjango18Warning:不推荐创建没有fields属性或 exclude属性的 ModelForm

如何 suppress Django 中的弃用警告?

ImportError:没有名为 django_filters 的模块

我将如何package打包和销售 Django 应用程序?