V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dolaxi
V2EX  ›  问与答

Django 或查询

  •  
  •   dolaxi · 2019-12-29 16:20:48 +08:00 · 1492 次点击
    这是一个创建于 1794 天前的主题,其中的信息可能已经有所发展或是发生改变。

    模型:

    class Goods(models.Model):
        name=models.CharField(max_length=50,verbose_name='名称')
        image = models.CharField(max_length=250,verbose_name='封面图')
        is_banner = models.BooleanField(default=False,verbose_name='是否是轮播图')
        nav = models.ForeignKey('Nav',verbose_name='所属分类导航')
    

    视图:

    class HomeView(request):
        banner_queryset=Goods.objects.filter(is_banner=1)[:3]    #首页 3 条轮播图数据
        clothes_queryset=Goods.objects.filter(nav_id=1)[:5]        #首页 5 条衣服数据
    

    这两个查询语句,合成一个查询语句,如何写?

    banner_queryset 、clothes_queryset 这两个查询出的结果,有些数据可能是重合的

    9 条回复    2019-12-29 21:43:28 +08:00
    uhian
        1
    uhian  
       2019-12-29 18:52:18 +08:00
    没有切片的可以 result = queryset1 | queryset2
    有切片操作的貌似不能这样
    实在不行将 clothes_queryset 加一个 exclude(id__in=[b.id for b in banner_queryset])?
    SingeeKing
        2
    SingeeKing  
       2019-12-29 18:56:02 +08:00
    搜索关键字:Django F
    SingeeKing
        3
    SingeeKing  
       2019-12-29 18:56:19 +08:00
    哦不,是 Django Q🌚
    uhian
        4
    uhian  
       2019-12-29 18:59:28 +08:00
    @SingeeKing Q 也不能切片啊
    SingeeKing
        5
    SingeeKing  
       2019-12-29 19:08:53 +08:00
    @uhian #4 他的切片可以直接用 limit 啊。。
    uhian
        6
    uhian  
       2019-12-29 19:31:56 +08:00
    @SingeeKing 切片不就是 LIMIT 么?还有别的操作?
    SingeeKing
        7
    SingeeKing  
       2019-12-29 20:03:40 +08:00
    @uhian #6 Django 竟然不能直接 Limit……

    搜了一下官方的说法,https://groups.google.com/forum/#!topic/django-users/Q4KB5qPlGtA 似乎没办法直接合
    uhian
        8
    uhian  
       2019-12-29 20:15:19 +08:00
    @SingeeKing Django 的切片,也就是[:3],实际做数据查询也就是转成 SQL 就是 limit。
    Django 的 LIMIT 没啥问题,问题是两个带 LIMIT 的查询结果( QuerySet )直接求或,貌似是真不行。查询结果本身可以求或,还可以返回 distinct 结果。
    dolaxi
        9
    dolaxi  
    OP
       2019-12-29 21:43:28 +08:00
    @SingeeKing @uhian
    有切片确实不好操作,
    result = queryset1 | queryset2 我试了一下,貌似可以成功,看原生查询语句,好像没啥毛病
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4335 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 01:02 · PVG 09:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.