- Django官方文档提供了使用distinct进行去重的操作,但是只支持
PostgreSQL
,具体操作可以看官方文档,就不再过多赘述。这里写的是一种支持MySQL进行去重的操作。 创建一个Book表
from django.db import models class Book(models.Model): book_name = models.CharField(max_length=256, verbose_name='名称') category = models.CharField(max_length=256, verbose_name='类型') price = models.IntegerField(verbose_name="价格") )
方案一,推荐方案,查询速度明显高于方案二。
queryset = self.queryset.extra(where=[ 'book.id in (SELECT id FROM book WHERE category=Python GROUP BY price, book_name)' ])
方案二,根据
price
和book_name
字段去重查询category
为Python的数据queryset = Book.objects.filter( id__in=[i.id for i in Book.objects.raw( "SELECT * FROM book where category=%s GROUP BY price, book_name", ["Python"] )] )
其实下面这一句查询条件就足够查到需要的数据,但是使用raw查出来的并不是一个
QuerySet
对象,想要继续在queryset
的基础上继续查询,就需要再进行一次转换。queryset = Book.objects.raw("SELECT * FROM book where category=%s GROUP BY price, book_name", ["Python"])