django内部连接相同的列不同的结果

时间:2013-12-10 00:19:35

标签: sql django json

我想我可能有一个解决方案 -

Django query where in

它基本上接近我的查询,而不是我在下面发布的(我希望)。

来自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以便我可以做一个heirarchy树,但为了做到这一点,我希望我的json设置为 -

{parent_name:Dept,name:Dept01234},{parent_name:Dept,name:Dept53452}

我已经在表上进行了内部联接,但问题是我想告诉它jobmst_id和jobmst_prntid都将从jobmst_name给我一个值,并且它将在每个键上显示不同的值。 / p>

希望这是有道理的。

更新 - 找到这个解释我正在尝试做什么 -

django self join query using aliases

但它并不一定解释如何让它基本上显示'jobmst_name','jobmst_name',同时给我一个父名称和另一个子名称,即使我正在查询同一列。 / p>

编辑 - 这是我正在处理的模型。

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'

1 个答案:

答案 0 :(得分:0)

对于任何可能遇到同样问题的人,我找到了解决方案(即如何让MPTT使用旧数据库!)

我在这里开始了MPTT教程 -

http://django-mptt.github.io/django-mptt/tutorial.html

然后我打开了我的SSMS并查看了django mptt是如何为测试创建表的。然后,我重新创建了遗留表中缺少的列 -

lft,rght,tree_id,level

以及FK / PK连接。

从那里我只需要在shell中加载模型 -

来自polls.models导入Jobmst Jobmst.objects.rebuild()

的Bam!然后,它通过运行模型创建了我需要的所有值。

现在我可以完成本教程的其余部分,现在我可以得到我的树视图输出,只需要在json中获取它,这样我就可以导入到d3中。

如果有人发现这个并且有问题,请告诉我。