2017-05-23 1 views
0

Mon modèle ressemble à ceci:Django ORM Filtrage

Person(model.Models): 
    name = model.CharField(max_length=32) 
    date_added = models.DateTimeField(auto_now_add=True) 

Note(model.Models): 
    person = model.ForeignKey(Person) 
    action = model.CharField(max_length=32, default='call) 
    date_added = models.DateTimeField(auto_now_add=True) 
    owner = model.ForeignKey(User) 

mon avis:

def get_working_persons(self): 
    relevant_actions = ['call', 'meeting', ...] 
    query = Q(action__in=relevant_note_actions) | Q(date_added__range=[fourteen_days_ago, now]) 
    get_current_person_notes = Note.objects.filter(query).exclude(~Q(owner=request.user)).values('owner', 'action', 'person') 

Cela renvoie une liste de notes, où chaque personne a toutes les notes énumérées, qui sont affichées dans le date_added__range. Comment puis-je obtenir la dernière note pour chaque personne dans cette plage de dates, qui répond aux autres critères?

Répondre

1
Note.objects.filter(query).exclude(~Q(owner=request.user)).values('owner', 'action', 'person').first() 

renverra l'objet haut de la queryset ou

Note.objects.filter(query).exclude(~Q(owner=request.user)).values('owner', 'action', 'person').last() 

retourne le dernier objet du queryset

ou plus tard le nom du champ

Note.objects.filter(query).exclude(~Q(owner=request.user)).values('owner', 'action', 'person').latest('field_name') 
+0

Merci beaucoup . D'après ce que je peux voir, cela retournera le dernier objet seulement. Je voudrais obtenir le dernier objet pour chaque personne. donc quelque chose comme: 'Select * de la note où DATE_ADDED entre maintenant et fourteen_days_ago GROUP BY person'' –

+0

@ 5h3z4n jeter un oeil à https://docs.djangoproject.com/en/1.11/topics/db/ agrégation/ –

+0

@ pawel.ad cela ressemble à ce dont j'ai besoin! Merci –