Django跟某几个字段去重MySQL

  • 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)'
        ])
  • 方案二,根据pricebook_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"])
上一篇:python发送邮件


下一篇:python3.5项目升级3.8问题汇总