【发布时间】:2013-12-10 00:19:35
【问题描述】:
我想我可能在这里有一个解决方案 -
它对我的查询的处理基本上与我在下面发布的不同(我希望如此)。
来自 SQL 背景,我有一个看起来像这样的查询(更新)-
SELECT a.jobmst_name AS Parent, b.jobmst_name as Job from jobmst a
inner join jobmst b on b.jobmst_prntid = a.jobmst_id
WHERE (a.jobmst_name = 'Dept' and a.jobmst_prntid IS NULL) OR b.jobmst_prntname LIKE '\Dept\%' AND b.jobmst_dirty <> 'X'
UNION
SELECT jobmst_prntname as Parent, jobmst_name as Job FROM jobmst
WHERE (jobmst_name = 'Dept' AND jobmst_prntid IS NULL)
这将返回如下列表 -
Parent Job
NULL Dept
01. Dept_sub01 01.01 Trade Recon
02. Dept_sub02 02.04 Dept_sub02.04
02.04 Dept_sub02.04 02.04.02 Dept_sub02.04
02.04 Dept_sub02.04 02.04.04 Dept_sub02.04
02.04 Dept_sub02.04 02.04.05 Dept_sub02.04
02.04.01 Dept_sub02.04.01 02.04.01.01 Dept_sub02.04.01
02.04.01 Dept_sub02.04.01 02.04.01.02 Dept_sub02.04.01
Dept 01. Dept_sub01
Dept 02. Dept_sub02
Dept 03. Dept_sub03
如何在 Django 中执行以下操作? UNION 是简单的部分,因此请忽略查询的该部分。重要的部分如下 -
jobmst_id 是表的主键。 jobmst_prntid 与 jobmst_id 相同,但不在同一行(如上所示)。
我正在尝试生成 json,以便我可以创建一个层次结构树,但要做到这一点,我希望我的 json 设置为 -
{parent_name:部门,名称:Dept01234},{parent_name:部门,名称:Dept53452}
我已经对一个表进行了内部连接,但问题是我想告诉它 jobmst_id 和 jobmst_prntid 都会给我一个来自 jobmst_name 的值,并且每个键上的值都会不同。
希望这是有道理的。
更新 - 发现这个解释了我正在尝试做的事情 -
django self join query using aliases
但它不一定解释如何让它基本上显示“jobmst_name”、“jobmst_name”,同时在一个上给我父名,在另一个上给我子名,即使我正在查询同一列。
编辑 - 这是我正在处理的模型。
class Jobmst(models.Model):
jobmst_id = models.IntegerField(primary_key=True)
jobmst_type = models.SmallIntegerField()
jobmst_prntid = models.IntegerField('self', null=True, blank=True)
jobmst_active = models.CharField(max_length=1, blank=True)
evntmst_id = models.IntegerField(blank=True, null=True)
jobmst_evntoffset = models.SmallIntegerField(blank=True, null=True)
jobmst_name = models.TextField(blank=True)
jobmst_mode = models.SmallIntegerField(blank=True, null=True)
jobmst_owner = models.ForeignKey('Owner', db_column='jobmst_owner', related_name = 'Jobmst_Jobmst_owner', blank=True, null=True)
jobmst_desc = models.TextField(blank=True) # This field type is a guess.
jobmst_crttm = models.DateTimeField()
jobdtl_id = models.IntegerField(blank=True, null=True)
jobmst_lstchgtm = models.DateTimeField(blank=True, null=True)
jobmst_runbook = models.TextField(blank=True) # This field type is a guess.
jobcls_id = models.IntegerField(blank=True, null=True)
jobmst_prntname = models.TextField(blank=True)
jobmst_alias = models.CharField(max_length=10, blank=True)
jobmst_dirty = models.CharField(max_length=1, blank=True)
def __unicode__(self):
return self.jobmst_name
class Meta:
managed = False
db_table = 'jobmst'
【问题讨论】: