Quiero usar django ORM para terminar de contar el grupo, pero seleccione el limit 21 cada vez. No quiero el límite, ¿por qué aparece el limit 21 y cómo puedo obtener todos los datos?
modelo:
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'código django en mis puntos de vista:
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')registro sql:
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;Como sugirió Iain en un comentario anterior, se agrega automáticamente un LIMIT 21 cuando se toma el repr() de un conjunto de consultas, lo que también ocurre implícitamente al imprimir un conjunto de consultas.
Para obtener el resultado completo, puede forzar el conjunto de consultas en una lista antes de imprimir, por ejemplo, en lugar de print(qs) , escribiría print(list(qs)) (que muestra todos los datos, pero omite el nombre de clase del conjunto de consultas).
El código relevante está aquí y aquí :
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) Tenga en cuenta que el LIMIT 21 también estará presente en las consultas generadas al llamar a .get() en un conjunto de consultas. Esto pretende ser una protección contra la base de datos que devuelve una tonelada de datos que se desecharán de todos modos. El límite podría haber sido 2, pero usar 21 significa que el error puede decirle cuántos registros se encontraron realmente (siempre que sea menos de 21). Esto da alguna penalización de rendimiento, pero solo en el caso de múltiples registros, lo que debería ser una situación excepcional. Cuando hay un solo registro, no hay gastos generales.
Vea la discusión de esto aquí y el código aquí :
MAX_GET_RESULTS = 21