2016-07-31 9 views
0

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() 
+0

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 –

+0

Und zusätzlich: was Sie dort tun, kann leicht mit dem ORM getan werden. –

+0

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

Antwort

0

Datum ist ein Datefield, so dass Sie es zu einem Datum vergleichen müssen, nicht die formatierte Darstellung des Datums (siehe diese Antwort: https://stackoverflow.com/a/18505739/5679413). Mit dem Format konvertieren Sie heute Zahlen und Bindestriche. Sie müssen die SQL-Abfrage in ein Datum zurückverwandeln. Django kümmert sich vermutlich darum für dich.

+0

Wenn das der Fall war, dann sollte die zweite Abfrage 'other_appointments' nicht für mich arbeiten! Korrigiere mich, wenn ich falsch liege. – Ketan

+0

Funktioniert es? Ich bekomme 'Operator existiert nicht: Datum> Integer' –

+0

Nein der vorgeschlagene Beitrag hat nicht geholfen! Aber die andere Abfrage mit '>' funktioniert für mich. Nicht sicher, warum es für dich nicht funktioniert hat. – Ketan