2016-07-21 3 views
0

sagen, dass ich diese Struktur haben:immer alle einzigartig/unterschiedliche Elemente aus einer viele zu viele Feld 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() 

die anderen Felder abgesehen, was ich versuche, alle einzigartigen Einheiten von a zu tun ist, erhalten Auswahl verschiedener Alarme. Sagen wir also, dass ich 3 unterschiedliche Alarme erhalte, und jeder von ihnen hat 4 Entitäten in seinem Feld "Viele Personen", sagen wir, dass ein Paar geteilt wird, ich möchte nur die eindeutigen bekommen.

Ich tue dies:

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

Aber wie ich vorstellen, das ist überhaupt nicht optimal, da ich viel Betrogenen zog am Ende und dann am Ende deduping. Ich habe versucht, die verschiedenen Value-Entitäten zu ziehen, aber das zieht mir ein Long, das als Schlüssel verwendet wird, um die Entitäten der bestimmten Alarmtabelle zuzuordnen. Irgendeine Möglichkeit, dies zu verbessern?

Antwort

0

Können Sie das versuchen?

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) 

Django doc über values_list.

+0

Ich bekomme dies: [749L, 729L, 738L, 716L, 776L, 735L] als Ergebnis anstelle der Entity-Objekt selbst :( –

+0

Ich habe meine Antwort bearbeitet. Es ist nicht sehr effizient, aber wenn Sie nicht viel haben –

+0

Ich habe die bearbeitete Antwort versucht, habe das: 'long' Objekt ist nicht iterierbar –

Verwandte Themen