2009-08-22 4 views
2

bekommen Wenn ichDjango - Wie nur 2 Objekt für eine Kombination von Feldern mit einem queryset

Model.objects.all() 

habe ich möchte nur ein Objekt für jeden content_object = foo, object_id = N erhalten. Wie kann ich das machen? Sagen Sie, ich bestelle bis zum Spätesten. Wenn ich nur ein Objekt im Abfrage-Set für einen content_type = foo, object_id = N ... bekommen kann, sollte es das letzte sein. Wie kann ich angeben, dass ich nur 1 Objekt für eine beliebige Kombination aus content_object und object_id haben möchte?

class CheckIn(models.Model): 
    ... 
    owner = models.ForeignKey('auth.User') 
    datetime = models.DateTimeField(editable=False, auto_now=True) 

    ... 
    # This is the object that should be geocoded, hopefully 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

    class Meta: 
     ordering=('-datetime',) 

Dann eine queryset zu nehmen:

checkins = CheckIn.objects.filter(
     datetime__gte=datetime.datetime.now() - 
     datetime.timedelta(hours=24), 
) 

das mir alle der checkins innerhalb der letzten 24 Stunden geben kann, aber ich will nur 1 Objekt pro content_type = foo und object_id = N.

+0

Ich denke, was Sie vielleicht suchen ist besser deutliche Unterstützung, die derzeit nicht verfügbar ist, aber es gibt einen Patch für sie: http: //code.djangoproject.com/ticket/6422 – mikl

Antwort

3

Wollen Sie das neueste Modell Objekt nach einer Filterung finden? Was meinst du mit Objekt-ID? Ist es ein Fremdschlüssel? Oder ist es die Model ID, die automatisch von django generiert wird? Ich denke, es ist das spätere. In diesem Fall können Sie nur ID verwenden. Dies kann Ihnen helfen, (I unter der Annahme bin, dass Sie zumindest diese Felder in Ihrem Modell haben: content_object, datefield):

Model.objects.filter(content_object=foo,id=N).order_by(dateField)[0] 

EDIT:

Ich entschuldige mich. Nun, die Frage war nicht diese klar am Anfang (und ich bin ein Newb). Hier ist ein naiver Ansatz (ich glaube, Sie verschiedene wollen):

d={} 
[d.setdefault(str(a.content_type)+str(a.object_id),a) for a in checkins ] 
d.values() # this gives your desired list of distinct objects 
+3

Fügen Sie hier eine Überprüfung auf Länge hinzu oder es wird in die Luft gehen, wenn es keine Objekte enthält. –

+0

schön, das könnte in der Tat die beste Antwort für jetzt sein. Wenn es einen effizienteren Weg gibt (nicht alles in den Speicher zu bringen/python_objects), wäre es besser. Aber, um mit einer Lösung zurück zu kommen, danke. –