2016-07-31 60 views
0

我正在使用Django预约系统!我想展示今天的约会。这个原始查询必须返回今天的记录,但它不返回任何记录!Django原始SQL查询不返回今天的记录

查询看起来像这样:

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""")) 

此外,today看起来是这样的:

today = datetime.date.today()

我试着在shell中使用Appointment.objects.filter(date=today)运行类似的查询,它工作正常!

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

请勿使用。 '.format()'在任何SQL查询上。它容易受到SQL注入的影响。在字符串中使用'%s'并将参数作为列表提交。示例:https://docs.djangoproject.com/en/1.9/topics/db/sql/#executing-custom-sql-directly –

+0

此外:您可以通过ORM轻松完成您的工作。 –

+0

有关如何使用ORM做到这一点的任何建议?我是django的新手,这就像我第一个完整的项目!欣赏它! – Ketan

回答

0

日期是将DateField所以你需要把它比作一个日期,而不是日期的格式表示(见这样的回答:https://stackoverflow.com/a/18505739/5679413)。通过使用格式,您今天转换为数字和破折号。您需要将SQL查询重新转换为日期。 Django大概是为你照顾的。

+0

如果是这样的话,那么第二个查询'other_appointments'不应该为我工作!如我错了请纠正我。 – Ketan

+0

它工作吗?我得到'运营商不存在:日期>整数' –

+0

没有建议的帖子没有帮助!但使用'>'的其他查询适用于我。不知道为什么它不适合你。 – Ketan