我想用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;
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