2017-10-20 2 views
0

J'essaie d'écrire une requête qui filtre en fonction d'une date particulière. Disons que j'ai trois dans le DBRequête Django avec __range et F

target_date = 28th of october 
today = 23rd of october 

data one 
publish_date = 26th of october 

data two 
publish_date = 24th of october 

data three 
publish_date = target_date # 28th of october 

Ma requête doit récupérer toutes les données qui sont trois jours ou moins avant la date cible. Puisque la date cible est le 28 octobre, toutes les données comprises entre le 26, le 27 et le 28 (date cible) doivent être récupérées.

requête

MyModel.objects.filter(
    publish_date__range=[F('publish_date'), F('publish_date') - timedelta(days=3)] 
) 

Le target_date varient selon les données de ligne. Je reçois un résultat inattendu.

Répondre

0

d'abord: "Je reçois un résultat inattendu." mauvaise façon de comprendre votre problème

deuxième: de toute façon vous aurez un problème dans le filtre parce que vous avez ajouté min date après la date max.

troisième: votre clause where dans la volonté sql ressemble:

WHERE "publish_date" BETWEEN F(publish_date) AND F(publish_date) - DurationValue(3 days, 0:00:00) 

il appliqué pour chaque ligne, vous obtiendrez vide requête définie

enfin que je peux voir, vous pouvez essayer de façon simple :

target_date = MyModel.objects.filter(HERE_YOUR_RULE).first().publish_date 
from_date = target_date - timedelta(days=3) 
MyModel.objects.filter(publish_date__range=[from_date, target_date]) 

ne pas oublier de changer HERE_YOUR_RULE, espérons qu'il aide.

+0

cela ne fonctionnera pas pour moi car il utilisera uniquement les premières données comme référence, la date-cible peut varier en fonction de la ligne de données. Probablement je n'ai pas bien expliqué –

0

Essayez ce filtre:

reference_date = MyModel.objects \ 
    .filter(user=some_user_receiving_email) \ 
    .order_by('-is_published')[0].is_published 

queryset_to_include_in_email = MyModel.objects.filter(
    publish_date__gte=reference_date - timedelta(days=3), 
    publish_date__lte=reference_date 
) 
+0

le target_date peut varier en fonction de la ligne, pouvez-vous expliquer plus sur le reference_date? Merci –

+0

Juste pour que je comprenne, y a-t-il un champ 'target_date' dans votre table en plus d'un champ' publish_date'? – davecaputo

+0

il n'y a pas de target_date, je n'ai que publish_date, je veux récupérer toutes les données qui seront publiées 3 jours avant publish_date et envoyer des emails à l'utilisateur. Donc, la date de publication diffère en fonction de ce que l'utilisateur entre –

0
MyModel.objects. 
     filter(publish_date__range= 
      [F('publish_date'), F('publish_date') + timedelta(days=3)]) 

qui va chercher tous les objets dont published_date dans la gamme entre la date de publication et trois jours après sa publication.