我想我可能有一个解决方案 -
它基本上接近我的查询,而不是我在下面发布的(我希望)。
来自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'
答案 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中。
如果有人发现这个并且有问题,请告诉我。