2011-01-13 5 views
1

Je dois créer un filtre pour un objet qui vérifie les plages de dates. En ce moment j'effectue une boucle très inefficace qui vérifie tous les objets. Je voudrais simplifier cela à un appel de base de données.Requêtes complexes Django

La logique est que vous avez un objet start et un objet end. J'ai besoin de vérifier si le début ou la fin est dans la plage d'un rendez-vous. Je pourrais le faire en SQL, mais je ne suis pas familier avec la structure du modèle Django pour les requêtes plus complexes.

Répondre

4

Vous avez besoin d'objets Q pour & et OU opérateurs et le type de recherche sur le terrain range

Q Objet: http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

gamme: http://docs.djangoproject.com/en/dev/ref/models/querysets/#range

Entry.objects.filter(Q(start__range=(appointment.start, appointment.end)) | 
    Q(end__range=(appointment.start, appointment.end))) 

Si un SQL BETWEEN, n'est pas ce que vous cherchez, vous pouvez toujours utiliser des combinaisons spécifiques d'objets Q pour reproduire exactement vos conditions:

Entry.objects.filter((Q(start__gte=appointment.start) & Q(start__lt=appointment.end)) | 
    (Q(end__gt=appointment.start) & Q(end__lte=appointment.end))) 
+0

En utilisant le premier exemple, où utilisez-vous 'start_date' et' end_date'? –

+0

Désolé Josh! L'exemple initial était directement à partir des docs, puis dans une mise à jour ultérieure, j'ai adopté vos variables spécifiques :) Je vais supprimer les –