从多个领域获取所有独特/不同的元素django

时间:2016-07-21 16:50:53

标签: mysql django

说我有这种结构:

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])]

但是正如我想象的那样,这根本不是最优的,因为我最终拉了很多傻瓜然后在结尾处进行重复推算。我已经尝试过拉出不同的值实体,但这会让我感觉很长,它被用作将实体映射到不同警报表的键。有什么方法可以改善这个吗?

1 个答案:

答案 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。