0
votes

Je souhaite filtrer par jour d'aujourd'hui et par identifiant de compte ce jour-là

Je suis nouveau sur Django Plz aidez-moi Mais dans ce cas, je veux un résultat comme

Cannot resolve keyword 'weekday' into field.

Actuellement, j'utilise cette requête Django comme suit

consultation_type = models.CharField(max_length=50, default="OFFLINE", choices=CONSULTATION)
  conversation_type = models.CharField(max_length=50, default="HOMEVISIT", choices=CONVERSATION)
  patient = models.ForeignKey(Patient,verbose_name=_('Patient'), null=True, on_delete=models.SET_NULL)
  doctor = models.ForeignKey(Doctor, verbose_name=_('Doctor'), null=True, on_delete=models.SET_NULL)
  visit_address = models.TextField(verbose_name=_('Address'))
  appointment_at = models.DateTimeField(verbose_name=_('Appointment at'),editable=True, blank=True,null=True)
  estimated_cost = models.FloatField(verbose_name=_('Estimated Cost'),default=0,validators=[MinValueValidator(0), MaxValueValidator(99999)])
  booking_status = models.CharField(verbose_name=_('Booking Status'), max_length=50, default= "WAITING", choices=BOOKINGSTATUS)
  cancel_reason = models.CharField(verbose_name=_('Cancel Reason'),max_length=200)
  comment = models.TextField(verbose_name=_('Comment'))
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)
  service = models.ForeignKey(to="doctors.Services", verbose_name=_('Service'), null=True, on_delete=models.SET_NULL)
  child = models.ManyToManyField(verbose_name=_('Child'),to="patients.Child", blank=True)
  payment_status = models.CharField(verbose_name=_('Payment Status'),max_length=50, default= "PENDING", choices=BOOKINGPAYMENTSTATUS)

Le point ici est 'Jour de la semaine' Je veux que le numéro de jour de la semaine d'aujourd'hui soit une clé, que j'utilise dans le filtre

Modèle:

 Booking.objects.filter(created_at__day=today.day).annotate(count=Count('id')).values('weekday', 'count') 

Erreur:

{weekday: todayweek_number, count: total_ids_count_number }


0 commentaires

3 Réponses :


0
votes

Code de mise à jour:

{'count': 1, 'weekday': 2}

Résultat:

from django.db.models import Count
from django.db.models.functions import ExtractWeekDay
from datetime import date
today = date.today()

Mymodel.objects.filter(created_at__day=today.day).annotate(count=Count('id'),weekday=ExtractWeekDay('created_at')).values('weekday', 'count') 


1 commentaires

Mise à jour réussie maintenant Vérifier .. Lorsque j'ajoute un champ de date, la même erreur se produit



1
votes

Il existe une fonction de base de données appelée ExtractWeekDay fourni par django. Vous pouvez l'utiliser comme ceci:

weekdays = [0, 0, 0, 0, 0, 0, 0]
weekdays[today.weekday()] = Booking.objects.filter(created_at__day=today.day).count()
previous_day = today - datetime.timedelta(days=1)
weekdays[previous_day.weekday()] = Booking.objects.filter(created_at__day=previous_day.day).count()

Mise à jour

À partir des commentaires de OP, pour autant que je sache, vous ne pouvez pas le faire comme [0, 32, 0, 0, 0, 0, 0, 0] en utilisant un jeu de requêtes. Mais avec une boucle, vous pouvez y parvenir comme ceci:

bookings = list(Booking.objects.filter(created_at__day=today.day).annotate(count=Count('id'),weekday=ExtractWeekDay('created_at')).values_list('weekday','count'))

weekdays = [0, 0, 0, 0, 0, 0, 0]
for i in bookings:
    weekdays[i[0]] = i[1]

OU utilisez simplement le code suivant:

from django.db.models.functions import ExtractWeekDay

Booking.objects.filter(created_at__day=today.day).annotate(count=Count('id'),weekday=ExtractWeekDay('created_at')).values('weekday', 'count') 


1 commentaires

Monsieur Oui, cette chose que je veux, mais maintenant j'ai une question, cette requête ne fournira que le jour d'aujourd'hui et le décompte d'aujourd'hui, mais cela ne montrera que les données d'aujourd'hui dans le graphique, Et si nous ce que les jours précédents comptent aussi, alors l'administrateur le fera mesurer les données du jour où la réservation sera interrompue



0
votes

Si vous utilisez Django 2, vous pouvez utiliser ExtractWeekDay pour regrouper le champ et compter combien.

comme:

from django.db.models.functions import ExtractWeekDay
Booking.objects.filter(created_at__day=today.day).annotate(weekday=ExtractWeekDay('created_at')).values('weekday').annotate(count=Count('id')).values('weekday', 'count')


0 commentaires