[英]How to convert a query to django ORM Query
I am trying to figure out how I can convert the following query into a Djangon ORM query. 我试图弄清楚如何将以下查询转换为Djangon ORM查询。 I am using Django 2.1 Python 3.5 on windows, I am trying to run the query against a Oracle database
我在Windows上使用Django 2.1 Python 3.5,正在尝试对Oracle数据库运行查询
SELECT m.msg_no, q.seq, To_Char(m.date_created,'yyyy/mm/dd hh24:mi:ss'), To_Char(SYSDATE,'yyyy/mm/dd hh24:mi:ss'), q.name, Round((round(SYSDATE - m.date_created,6)*1440),1) AS msg_age
FROM message m
INNER JOIN queue q ON m.queue = q.seq
WHERE m.date_created >= (SYSDATE - 13/24)
AND m.status1 = 0
AND m.direction = 0;
I have two models, would like to know how to best, the tables Message and Queue are relate by Queue primary key SEQ and Message foreign key QUEUE, so SEQ == QUEUE in Message table: 我有两个模型,想知道如何做到最好,表Message和Queue由Queue主键SEQ和Message外键QUEUE关联,所以Message表中的SEQ == QUEUE:
from django.db import models
# Create your models here.
class Queue(models.Model):
SEQ = models.IntegerField(primary_key=True,)
NAME = models.CharField(max_length = 50)
INPUT_DRIVER = models.IntegerField()
OUTPUT_DRIVER = models.IntegerField()
DIRECTION = models.IntegerField()
ORIGINATOR = models.IntegerField()
DESTINATOR = models.IntegerField()
PRIORITY = models.IntegerField()
INPUTEXEC = models.CharField(max_length = 100)
OUTPUTEXEC = models.CharField(max_length = 100)
USERID = models.CharField(max_length = 8)
TMSTAMP = models.DateTimeField(max_length = 7)
QUEUE_TYPE = models.CharField(max_length = 16)
class Meta:
db_table = "QUEUE"
#
class Message(models.Model):
MSG_NO = models.IntegerField(primary_key=True,)
MSG_TYPE = models.IntegerField()
DIRECTION = models.IntegerField()
SESSION_NO = models.IntegerField()
SEQUENCE_NO = models.IntegerField()
REF_SESSION = models.IntegerField()
REF_SEQUENCE = models.IntegerField()
ACKTIME = models.DateTimeField(max_length = 7)
ACKNAKSTATUS = models.IntegerField()
PRIORITY = models.CharField(max_length = 1)
DELIVMONITOR = models.IntegerField()
OBSOLESCENCE = models.IntegerField()
DISPOSITION = models.IntegerField()
TRAILER = models.IntegerField()
BYPASSED = models.IntegerField()
RESPONSE_QUEUE = models.IntegerField()
SOURCE_QUEUE = models.IntegerField()
QUEUE = models.IntegerField()
QUEUE_PRIORITY = models.IntegerField()
DATE_CREATED = models.DateTimeField(max_length = 7)
DATE_ROUTED = models.DateTimeField(max_length = 7)
INPUT_FILE = models.IntegerField()
OUTPUT_FILE = models.IntegerField()
STATUS1 = models.IntegerField()
STATUS2 = models.IntegerField()
STATUS3 = models.IntegerField()
USERID = models.CharField(max_length = 8)
TMSTAMP = models.DateTimeField(max_length = 7)
class Meta:
db_table = "MESSAGE"
If you want to use Djangos ORM to build that query, you should use the relationship fields . 如果要使用Django的ORM来构建该查询,则应使用关系字段 。
First, I suggest you change the field to this: 首先,建议您将字段更改为:
QUEUE = models.ForeignKey(to=Queue, on_delete=models.PROTECT)
And then try something like this: 然后尝试这样的事情:
import datetime
from django.utils import timezone as tz
now = tz.now()
filter_date = now - datetime.timedelta(hours=...something...)
qs = Message.objects.filter(
STATUS1=0, DIRECTION=0, DATE_CREATED__gte=filter_date)
You may want to look into QuerySet.annotate()
. 您可能需要研究
QuerySet.annotate()
。
This still needs to be tweeked to fit your exact query, but my answer should but you on the right course to figure it out. 这仍然需要进行调整,以适合您的确切查询,但是我的答案应该是,但是您在正确的方向上可以解决它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.