django annotate意外限制21

问题描述 投票:1回答:1

我想用django ORM来完成counting group by,但select sql出乎意料。limit 21 每次都是这样。我不想限制,为什么 limit 21 出现,如何获得所有数据?

模型。

class Company(models.Model):
    company_no = models.CharField(primary_key=True, max_length=128)
    name = models.CharField(max_length=128)
    is_test = models.BooleanField(default=False)
    class Meta:
        db_table = 'company'

class User(models.Model):
    symbol = models.BigIntegerField(primary_key=True)
    is_test = models.BooleanField(default=False)

    class Meta:
        db_table = 'user'

class UserEmploy(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, db_column='symbol', to_field='symbol', related_name='employ')
    company = models.ForeignKey(Company, on_delete=models.CASCADE, to_field='company_no', db_column='company_no', related_name='user_employ')
    class Meta:
        db_table = 'user_employ'

Django代码在我的视图中。

   employ_qs_exclude_test = UserEmploy.objects\
        .exclude(user__is_test__in=utils.IS_TEST_MODE)\
        .values("company__name") \
        .annotate(employ_count=Count('user', distinct=True))\
        .order_by('company')

sql log:

SELECT `company`.`name`, COUNT(DISTINCT `user_employ`.`symbol`) AS `employ_count` FROM `user_employ`
INNER JOIN `user`
ON (`user_employ`.`symbol` = `user`.`symbol`)
INNER JOIN `company` 
ON (`user_employ`.`company_no` = `company`.`company_no`)
WHERE NOT (`user`.`is_test` IN (1))
GROUP BY `company`.`name`, `company`.`created_at`
ORDER BY `company`.`created_at` DESC LIMIT 21;
django group-by django-queryset limit annotate
1个回答
0
投票

Iain在上面的评论中建议,在取的时候会自动加一个limit 21。repr() 的,这在打印一个查询集时也会隐含地发生。

为了得到完整的输出,你可以在打印前强制将查询集放入一个列表中,例如,在打印前不使用 print(qs) 你会写 print(list(qs)) (它显示了所有数据,但省略了查询集类名)。

相关代码为 此处此处:

REPR_OUTPUT_SIZE = 20

def __repr__(self):
    data = list(self[:REPR_OUTPUT_SIZE + 1])
    if len(data) > REPR_OUTPUT_SIZE:
        data[-1] = "...(remaining elements truncated)..."
    return '<%s %r>' % (self.__class__.__name__, data)

请注意,LIMIT 21也将出现在通过调用以下文件产生的查询中: .get() 可能是作为一种保障措施,当你只需要一个数据时,就会返回一大堆数据(但限制不是1,以确保当返回多个数据时,你会得到一个有意义的错误。

请看 此处:

MAX_GET_RESULTS = 21
© www.soinside.com 2019 - 2024. All rights reserved.