注Django查询集使用'related_name'跨ManyToMany关系(没有'Count','G','Max,...)

0

的问题

我有的模型在我的代码类似于以下内容:

class CompanyProject(models.Model):
    """ This class holds project related information read in from the 'project'
        custom 'manage.py' command.
    """

    project_number = models.IntegerField(blank=False, null=False, unique=True)
    project_worktype = models.CharField(blank=True, max_length=255, null=True)
    created_at = models.DateTimeField(auto_now_add=True, blank=False, null=False)
    updated_at = models.DateTimeField(auto_now=True, blank=False, null=False)
    last_seen = models.DateField(blank=False, null=False)


    def get_project_subtypes(self):
        subtypes = self.project_subtype.all()
        return [ subtype.project_subtype for subtype in subtypes ]

    class Meta:
        ordering = ['project_number']

class CompanySubType(models.Model):
    class CompanySubTypeChoices(models.TextChoices):
        G1A = '1A', _('1A')
        G1B = '1B', _('1B')
        G2A = '2A', _('2A')
        G2B = '2B', _('2B')
        G3A = '3A', _('3A')
        G3B = '3B', _('3B')

    company_project = models.ManyToManyField(CompanyProject, related_name='project_subtype')
    project_subtype = models.CharField(blank=False, choices=CompanySubTypeChoices.choices, max_length=2, null=False)


class ListEntry(models.Model):

    list_project = models.OneToOneField(CompanyProject, on_delete=models.CASCADE, related_name='list_project')
    list_reviewer = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='+')

我想再回一套附加说明 ListEntry 目标注一个列表中的所有项目的亚型的鉴定的 ListEntry 的项目。

最终,我需要能够通过这个附加说明的数据来Django其他框架的程序但我需要获得该注释的工作像我想到的第一个。

我的问题是,我可以注释只是现在做的事情是这样的:

list_entry_qs = ListEntry.objects.prefetch_related('list_project', 'list_reviewer').annotate(subtypes=F('list_pmatt__project_subtype__project_subtype')).all()

和它的工作原理就好了。 这个问题我有的是,查询设置,就是返回该命令的副本的 list_entry 对象如果有多于一个 subtype 注释。

例如,如果一个项目编号1234有两个项目的类型、'1A'和'3A,我拿两个 list_entry 对象:一个 subtype 注释'1A'和一个独立的 list_entry 对象为同一项目与 subtype 注释'3A'。

我会像一个物体返回项目1234有一个 subtype 注释的'1A'、'2A',最终将化为JSON对象。

必须有一个简单的方法来做到这个吗?

1

最好的答案

0

好的,在花费从字面上8小时,在此,我终于发现了如何做到这一点:

from django.contrib.postgres.aggregates.general import ArrayAgg

q = ListEntry.objects.prefetch_related('list_pmatt', 'list_reviewer', 'list_pmatt__project_subtype').annotate(my_subtype=ArrayAgg('list_pmatt__project_subtype__project_subtype'))

>>> q[2].my_subtype
['1A', '3A']
2021-11-17 23:21:39

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................