社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

新手有个问题想请教一下

vurtne • 9 年前 • 2567 次点击  

比如网站有一个新闻版块,里边的新闻分了很多分类,现在要在一个页面上显示所有分类并且显示分类下的最新一条新闻,查询应该怎么写呢? 模型类似于这样:

class Category(models.Model):
    name = models.Charfield()
class News(models.Model):
    title = models.Charfield()
    cat = models.ForeignKey(Category)
    date = models.DatetimeField()
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1310
 
2567 次点击  
文章 [ 3 ]  |  最新文章 9 年前
MCC
Reply   •   1 楼
MCC    9 年前

如果自己拼sql mysql就

select * from (
    SELECT * FROM test.sleep_news order by -date)
as Subquery group by cat_id;

其他如果有with的就更好弄了,写得可以更美一些。

要是不在乎查询多次的话直接

results = {}
    Categories = Category.objects.all()
    for category in Categories:
        news = News.objects.filter(cat=category).order_by('-date')[0]
        results[category] = news

有些云服务居然是用查询sql次数来收费的我就不吐槽了。。

rapospectre
Reply   •   2 楼
rapospectre    9 年前
news_list = News.objects.distinct('cat__name')

如果是bakend数据库是mysql数据库,改为这样写:

news_list = News.objects.values('cat__name').distinct()

如果用sqlite或者postgresql用第一种写法没有问题。

MCC
Reply   •   3 楼
MCC    9 年前
results = News.objects.all().order_by('cat', '-date').annotate(Count('cat'))
    items = {}
    for result in results:
        print result.cat,result.title
        if not result.cat in items:
            items[result.cat] = result

distinct不太好用,就这样将就了……或者不要应用django的orm 自己拼sql或者SQLAlchemy