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 }
3 Réponses :
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')
Mise à jour réussie maintenant Vérifier .. Lorsque j'ajoute un champ de date, la même erreur se produit
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()
À 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')
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
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')