【问题标题】:django inner join same column different resultsdjango内部加入同一列不同的结果
【发布时间】:2013-12-10 00:19:35
【问题描述】:

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

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,以便我可以创建一个层次结构树,但要做到这一点,我希望我的 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'

【问题讨论】:

    标签: sql django json


    【解决方案1】:

    对于可能遇到与我相同问题的任何人,我找到了解决方案(即如何让 MPTT 与旧数据库一起工作!)

    我在这里浏览了 MPTT 教程的开头 -

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

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

    lft, rght, tree_id, 级别

    以及 FK/PK 连接。

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

    从 polls.models 导入 Jobmst Jobmst.objects.rebuild()

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

    现在我可以完成本教程的其余部分,我现在可以获取我的树视图输出,只需将其以 json 格式获取,以便我可以导入到 d3。

    如果有人发现这个并且有任何问题,请私信我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多