Ich machte ein Termin-System mit Django! Ich wollte die heutigen Termine anzeigen. Diese rohe Abfrage muss die heutigen Datensätze zurückgeben, gibt aber keinen Datensatz zurück!Django Raw SQL-Abfrage gibt die heutigen Datensätze nicht zurück
Abfrage sieht wie folgt aus:
todays_appointments = Appointment.objects.raw("""
SELECT appointment_Appointment.id,
loginReg_User.user_name,
appointment_Appointment.task,
appointment_Appointment.date,
appointment_Appointment.time,
appointment_Appointment.status
FROM appointment_Appointment
LEFT JOIN loginReg_User
ON appointment_Appointment.user_id = loginReg_User.id
WHERE loginReg_User.id={}
AND appointment_Appointment.date={}
ORDER BY appointment_Appointment.time".format(user_id, today"""))
Auch sieht today
etwas wie folgt aus:
today = datetime.date.today()
.
Ich habe versucht, ähnliche Abfrage in der Shell mit Appointment.objects.filter(date=today)
ausgeführt und es hat gut funktioniert!
Models.py
from __future__ import unicode_literals
from ..loginReg.models import User
from django.db import models
import datetime
class AppointmentValidator(models.Manager):
def task_validator(self, task):
if len(task) < 1:
return False
else:
return True
def date_validator(self, date_time):
present = datetime.now().date()
if date_time < present:
return False
else:
return True
def status(self, status):
if status == "missed" or status == "done" or status == "pending":
return True
else:
return False
class Queries(models.Manager):
def todays_appointments(self, user_id):
today = datetime.date.today()
todays_appointments = Appointment.objects.raw("SELECT appointment_Appointment.id, loginReg_User.user_name, appointment_Appointment.task, appointment_Appointment.date, appointment_Appointment.time, appointment_Appointment.status FROM appointment_Appointment LEFT JOIN loginReg_User ON appointment_Appointment.user_id = loginReg_User.id WHERE loginReg_User.id={} AND appointment_Appointment.date={} ORDER BY appointment_Appointment.time".format(user_id, today))
return todays_appointments
def other_appointments(self, user_id):
today = datetime.date.today()
other_appointments = `Appointment.objects.raw("SELECT appointment_Appointment.id, loginReg_User.user_name, appointment_Appointment.task, appointment_Appointment.date, appointment_Appointment.time, appointment_Appointment.status FROM appointment_Appointment LEFT JOIN loginReg_User ON appointment_Appointment.user_id = loginReg_User.id WHERE loginReg_User.id={} AND appointment_Appointment.date>{} ORDER BY appointment_Appointment.time".format(user_id, today))`
return other_appointments
class Appointment(models.Model):
task = models.CharField(max_length=150)
date = models.DateField(null=False, blank=False)
time = models.TimeField()
status = models.CharField(max_length=45)
user = models.ForeignKey(User)
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
appointmentManager = AppointmentValidator()
queries = Queries()
objects = models.Manager()
Nicht verwenden. '.format()' für jede SQL-Abfrage. Es macht anfällig für SQL-Injektionen. Verwenden Sie '% s' in der Zeichenfolge und übergeben Sie die Argumente als Liste. Beispiel: https://docs.djangoproject.com/de/1.9/topics/db/sql/#executing-custom-sql-directly –
Und zusätzlich: was Sie dort tun, kann leicht mit dem ORM getan werden. –
irgendwelche Vorschläge, wie Sie dies mit ORM tun? Ich bin neu bei Django und das ist wie mein erstes volles Projekt! Bin dankbar! – Ketan