构造__in查询的正确方法?

时间:2014-08-05 05:12:41

标签: django

我有两张桌子,如下所示。

class AlertTable(models.Model):
    id = models.AutoField(primary_key=True)
    alarm_text = models.CharField(max_length=800,blank=False,null=False)
    event_type = models.SmallIntegerField(blank=False,null=False)
    created = models.DateTimeField()
    class Meta:
        ordering = ['-id']
    def __unicode__(self):
        return str(self.id)

class PendingAlertsTable(models.Model):
    id = models.AutoField(primary_key=True)
    alerttable = models.ForeignKey(AlertTable)
    created = models.DateTimeField()
    class Meta:
        ordering = ['-id']
    def __unicode__(self):
        return str(self.id)

Idea是PendingAlertsTable持有对尚未确认的警报的引用。并且AlertTable保存所有警报。

所以我想构建一个查询,以便我可以从AlertTable中获取所有待处理的条目。

所以我构建了这样的查询:

inner_qs=PendingAlertsTable.objects.all()
all_pending_event = AlertTable.objects.filter(pk__in=inner_qs)

这不会给我在all_pending_event的预期条目中设置查询。在这种情况下构造__in查询的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

默认情况下,它将使用不是AlertTable主键的PendingAlertsTable记录的id。

请改为尝试:

pending_alert_ids = PendingAlertsTable.objects.values_list('alerttable__pk', flat=True).all()
all_pending_event = AlertTable.objects.filter(pk__in=pending_alert_ids)

或者更好的是,只需使用prefetch_relatedselect_related并执行:

all_pending_events = [ p.alerttable for p in PendingAlertsTable.objects.prefetch_related('alerttable') ]