你如何将它压缩成一个查询

时间:2014-09-26 01:52:25

标签: django django-queryset

我有以下型号:

class ReportLayout(models.Model):
    company = models.ForeignKey(Company, blank=True, null=True)
    name = models.CharField(max_length=64)
    ...
    class Meta:
        ordering = ('name', )

以下的ModelManager方法:

def for_company(self, company):
    names = self.filter(company=company).values_list('name', flat=True)
    public_ids = self.filter(company__isnull=True).exclude(
        name__in=names).values_list('id', flat=True)
    return self.filter(Q(company=company)|Q(id__in=public_ids))

我们的想法是获取公司的所有ReportLayouts。这些包括:

  1. 属于公司的ReportLayouts,
  2. 上面1中没有匹配名称的所有公共/共享ReportLayouts(其中company = null)。
  3. 所以,如果我有3个ReportLayouts:

    id Name  Company
    1  A     null
    2  B     null
    3  B     Company1
    

    for_company(Company1)应该返回ID为1和3的ReportLayouts

    似乎我应该能够在一个查询中编写它,但到目前为止我最好的是3.问题源于.filter / .exclude函数对和缺少的__notin运算符。

    我希望能够执行.count(),并且我希望查询提供的顺序是我不仅仅在2个查询中执行此操作的原因。但我如何在一个方面做到这一点完全是在逃避我。

0 个答案:

没有答案