2016-06-11 6 views
0

zu sortieren Ich brauche Hilfe beim Erstellen eines Abfrage-Sets (oder Array), die mehr als einen Typ von Elementen (anders Klassen) durch ein gemeinsames Attribut.Wie Abfrage Set (oder Array) mit mehr als einem Typ von Elementen (Klassen) nach gemeinsamen Attribut mit Django Python

hier sind die Klassen:

class aaa(models.Model): 
    fd   = models.CharField(max_length=100, unique=True) 

    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 
    updated  = models.DateTimeField(auto_now_add=True, auto_now=False) 

    #more attributes... 

    def __str__(self): 
     return self.fd 

class bbb(models.Model): 
    fd  = models.CharField(max_length=100) 
    date = models.DateTimeField(blank=True, null=True) 

    #more attributes... 

    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 
    updated  = models.DateTimeField(auto_now_add=True, auto_now=False) 

    class Meta: 
     ordering = ["-timestamp"] 

    def __str__(self): 
     return self.fd 

Ich mag durch das Attribut „Zeitstempel“ all diese Elemente sortieren (das ist das gleiche in den beiden Klassen).

Bisher ist es das, was ich habe:

my_objects = (aaa.objects.all(),bbb.objects.all()) 

, dass die Abfrage Satz aller Elemente erzeugt. Ich bevorzuge die Art der Abfrage gesetzt, wenn es besser ist, Array oder eine andere Struktur zu verwenden, lass es mich wissen.

danke!

+1

"Das erstellt den Abfragesatz aller Elemente" nicht wahr: Dies ist eine Liste von 2 Abfragesätzen. Ich würde nach Python suchen, um eine Vereinigung der 2 Abfragegruppen als Liste oder so ähnlich zu sortieren. – Wtower

+0

Sie können keine Abfragesätze aus verschiedenen Modellen zusammenführen. Zumindest nicht, wenn sie unterschiedliche Felder haben. Für eine mögliche Lösung hava https://benzidwael.wordpress.com/2015/05/16/merge-querysets-from-different-django-models/ – tobltobs

+0

vielen Dank @tobtobs hat es funktioniert! Ist es eine bessere Lösung, um eine Klasse zu erstellen, um diese in Klassen zu integrieren? –

Antwort

1

das Rohr verwenden querysets zu fusionieren:

combined = qs1 | qs2 | qs3 

Aber diese nicht funktionieren für querysets aus verschiedenen Modellen, zumindest nicht, wenn sie diffferent Felder aus. Sie erhalten einen Cannot combine queries on two different base models. Fehler. Eine mögliche Lösung ist die Verwendung itertools.chain, wie in this blog post, die ich hier als Referenz angeben.

from itertools import chain 
result_lst = list(chain(queryset1, queryset2)) 

Jetzt können Sie die resultierende Liste nach einem beliebigen allgemeinen Feld sortieren, z. Erstellungsdatum

from operator import attrgetter 
result_lst = sorted(
    chain(queryset1, queryset2), 
    key=attrgetter('created_at'))