【问题标题】:Return only most recent call per caller仅返回每个呼叫者最近的呼叫
【发布时间】:2013-12-27 02:47:18
【问题描述】:

假设您有一个表示通话记录的模型,其中包含:您呼叫的人 (callid)、通话日期 (calldate) 以及是否需要重新联系被呼叫的人。

class CallLog(models.Model): 
    id = models.AutoField(primary_key=True)
    calledid = models.BigIntegerField()
    calldate = models.DateField()
    recontact = models.BooleanField()

我想做的是收集一组calledid,在他们最后一次通话中确定他们不想再次被联系(recontact=False)。 calledid 不是唯一的,同一个人可能有不止一个电话导致之前没有重新联系,因此我们必须始终根据他们最近的通话日期确定是否应该重新联系他们。

我该怎么做呢?


这是我迄今为止尝试过的......不确定这是否有效

calls = CallLog.objects.order_by("-calldate")

seen = set()
seencalledid = set()
keep = []

for o in calls:
    if o.calleid not in seen:
        keep.append(o)
    seen.add(o.calledid)
        if o.recontact:
            seencalledid.add(o.callid)

no_recontact = CallLogs.filter(calledid__in = seencalledid).values_list('calledid',flat=True)

【问题讨论】:

  • 做一个按calldata排序的查询并检查recontact值?
  • 如果每个被叫ID只有一个呼叫,这将起作用。但是因为它们不是唯一的,所以这是行不通的。

标签: python django


【解决方案1】:

这产生了预期的结果,但必须有一种更快捷的方式来捕获这些信息。

calls = CallLog.objects.order_by("-calldate")

seen = set()
seencallid = set()
keep = []

for o in calls:
    if o.calledid not in seen:
        keep.append(o)
    seen.add(o.calledid)
        if o.recontact:
            seencallid.add(o.callid)

no_recontact = CallLogs.filter(callid__in = seencallid).values_list('calledid',flat=True)

【讨论】:

    【解决方案2】:

    每个被调用ID 的几次调用是您按日期排序的原因。该排序列表中的最后一条记录应该是您想要的 django - get the latest record with filter

    Model.objects.filter(calledid=ID).order_by('-calldate')[0]
    

    【讨论】:

    • 我想做的是收集calledid 的集合,在他们最后一次通话中确定他们不想再次被联系(recontact=False)。这只会返回一个我可以通过.latest() 得到的响应。
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多