【问题标题】:Filtering a queryset in django for one of every type of entry在 django 中为每种类型的条目中的一种过滤查询集
【发布时间】:2011-03-06 06:38:12
【问题描述】:

我有一个模型,其中包含外键和其他一些东西。外键不是唯一的条目,也就是说,用户可以根据需要多次将他或她自己添加到数据库中。我想过滤我的查询集,以便为每种类型的用户生成一个条目。例如:

id | user_id (fk) | message
---+--------------+--------------
1  | 1            | hello!
2  | 5            | hey
3  | 1            | how are you?
4  | 5            | great!

使用我上面指定的条件进行过滤会得到(1, 5)

不知道要使用哪种方法,或者我是否必须自己写一些东西。无论哪种方式,我们都将不胜感激。

【问题讨论】:

    标签: mysql django


    【解决方案1】:

    经过进一步审查,我确定答案是应用于查询集时的 distinct() 函数:)

    http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.QuerySet.distinct

    【讨论】:

    • 只有当 user_id 是您感兴趣的唯一字段时才有效。如果您需要从消息中检索 idmessage, distinct 不会按您的预期过滤.您还需要在查询集上指定values('user'),它将返回[{'id':1}, {'id':5}]
    【解决方案2】:

    如果您想访问模型实例而不仅仅是外键,您可以执行以下操作:

    from django.db.models import Max
    
    # get the latest id for each user_id (most recent)
    latest = Message.objects.values('user_id').annotate(id=Max('id'))
    Message.objects.filter(id__in=[m['id'] for m in latest])
    

    这不如原始 sql 等效项好,因为返回了一个选择,然后用作 IN () 过滤器的基础。它相当慢。另一种方法是编写原始 SQL,您应该避免这种情况。

    -- here it is anyway
    
    SELECT m.id, m.user_id, m.message
    FROM Messages m
    JOIN (
             SELECT user_id, max(id) as max_id
             FROM Messages
             GROUP BY user_id
         ) mm
    ON m.id = mm.max_id
    

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多