说我有这种结构:
class Distinct_Alert(models.Model):
entities = models.ManyToManyField(to='Entity', through='Entity_To_Alert_Map')
objects = Distinct_Alert_Manager()
has_unattended = models.BooleanField(default=True)
latest_alert_datetime = models.DateTimeField(null=True)
class Entity_To_Alert_Map(models.Model):
entity = models.ForeignKey(Entity, on_delete=models.CASCADE)
distinct_alert = models.ForeignKey(Distinct_Alert, on_delete=models.CASCADE)
entity_alert_relationship_label = models.TextField()
class Entity(models.Model):
label = models.CharField(max_length=700, blank=False)
related_entities = models.ManyToManyField('self')
identical_entities = models.ManyToManyField('self')
objects = Entity_Manager()
无视其他字段,我要做的是从一系列不同的警报中获取所有独特的实体。所以说我拉3个不同的警报,并且每个警报在其多个实体字段中都有4个实体,比如在它们之间,一对夫妇共享,我想只得到不同的。
我这样做:
ret_list = map(lambda x: x.get_dictionary(), itertools.chain(*[alert.entities.all() for alert in
Distinct_Alert.objects.filter(
has_unattended=True,
entities__related_entities__label=threat_group_label)]))
return [dict(t) for t in set([tuple(d.items()) for d in ret_list])]
但是正如我想象的那样,这根本不是最优的,因为我最终拉了很多傻瓜然后在结尾处进行重复推算。我已经尝试过拉出不同的值实体,但这会让我感觉很长,它被用作将实体映射到不同警报表的键。有什么方法可以改善这个吗?
答案 0 :(得分:0)
你能试试吗?
entity_ids = EntityToAlertMap.objects.filter(distinct_alert__has_unattended=True,
entity__related_entities__label=thread_group_label)) \
.values_list('entity', flat=True).distinct()
Entity.objects.filter(id__in=entity_ids)
关于values_list的Django doc。