V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
dolaxi
V2EX  ›  问与答

Django 或查询

  •  
  •   dolaxi · Dec 29, 2019 · 2076 views
    This topic created in 2317 days ago, the information mentioned may be changed or developed.

    模型:

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

    搜了一下官方的说法,https://groups.google.com/forum/#!topic/django-users/Q4KB5qPlGtA 似乎没办法直接合
    uhian
        8
    uhian  
       Dec 29, 2019
    @SingeeKing Django 的切片,也就是[:3],实际做数据查询也就是转成 SQL 就是 limit。
    Django 的 LIMIT 没啥问题,问题是两个带 LIMIT 的查询结果( QuerySet )直接求或,貌似是真不行。查询结果本身可以求或,还可以返回 distinct 结果。
    dolaxi
        9
    dolaxi  
    OP
       Dec 29, 2019
    @SingeeKing @uhian
    有切片确实不好操作,
    result = queryset1 | queryset2 我试了一下,貌似可以成功,看原生查询语句,好像没啥毛病
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2368 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 10:34 · PVG 18:34 · LAX 03:34 · JFK 06:34
    ♥ Do have faith in what you're doing.