2017-12-09 3 views
0

Ich habe eine Django App, und ich versuche herauszufinden, Mitarbeiter, die nicht in Anwesenheit 2017-12-05 war. Ich versuche, ein Abfrage-Set zu finden, um dies zu erreichen.Django Queryset NICHT INTERSECT für 2 Modelle mit Postgres

Im Folgenden sind die Details des Modells, Datensätze und das Ergebnis, das ich versuche zu erreichen.

Ich habe 2 Modelle:

class Employee(models.Model): 
    fullname = models.CharField(max_length=30, blank=False)  

class Attendance(models.Model): 
    CHECKIN = 1 
    CHECKOUT = 2 
    ATTENDANCE_TYPE_CHOICES = (
     (CHECKIN, "Check In"), 
     (CHECKOUT, "Check Out"), 
    ) 
    employee = models.ForeignKey(Employee) 
    activity_type = models.IntegerField(choices = ATTENDANCE_TYPE_CHOICES, default=CHECKIN) 
    timestamp = models.DateTimeField(auto_now_add=True) 

Angenommen, ich habe die Datensätze unter:

Employee 
{"id":1, "employee":"michael jackson", 
"id":2, "fullname":"mariah carey", 
"id":3, "fullname":"taylor swift", 
"id":4, "fullname":"selena gomez"} 

Attendance 
{"id":1, "employee": 1,"activity_type": 1, timestamp: "2017-12-05 09:08",  
"id":2, "employee": 2,"activity_type": 1, timestamp: "2017-12-05 10:13", 
"id":3, "employee": 2,"activity_type": 2, timestamp: "2017-12-05 15:13", 
"id":4, "employee": 2,"activity_type": 1, timestamp: "2017-12-05 19:13", 
"id":5, "employee": 3,"activity_type": 1, timestamp: "2017-12-06 08:08"} 

Dies ist die beabsichtigte Ausgabe Ich versuche zu erreichen:

Für das Datum 2017- 12-05, dieser Mitarbeiter war nicht anwesend (dh es gab keinen Eintrag in Anwesenheit für 2017-12-05)

{"id":3, "fullname":"taylor swift", 
"id":4, "fullname":"selena gomez"} 

Was ist der Queryset, um den Mitarbeiter aufzulisten, der an einem bestimmten Datum 2017-12-05 nicht anwesend ist? Ich glaube, es ist ein Schnittpunkt und macht ein NICHT mit dem Mitarbeiter.

Antwort

1

Sie können dies mit einem einfachen exclude() Abfrage tun:

from datetime import date 

today = date.today() 

Employee.objects.exclude(attendance__timestamp__date=today) 

Dies wird Ihnen alle Mitarbeiter, wo es keine Teilnahme an diesem Tag aufgenommenen war.

Weitere Informationen zum Erstellen der Suche finden Sie unter this section of the documentation.

Verwandte Themen