我有一对多的关系表,其中有一些数据位于连接基础

我的模型的基本版本如下:

class FooLine(models.Model):
    name = models.CharField(max_length=255)

class FooCol(models.Model):
    name = models.CharField(max_length=255)

class FooVal(models.Model):
    value = models.CharField(max_length=255)
    line = models.ForeignKey(FooLine)
    col = models.ForeignKey(FooCol)

如果该值不存在,我正在尝试使用null搜索某个行的每个值(基本上我正在尝试显示fooval表,其值为尚未填充的值的空值) 一个典型的SQL将是

SELECT value FROM FooCol LEFT OUTER JOIN 
  (FooVal JOIN FooLine 
  ON FooVal.line_id == FooLine.id AND FooLine.name = "FIXME") 
ON FooCol.id = col_id;

有没有办法使用django模型

对上面的查询进行建模

由于

有帮助吗?

解决方案

外部联接可以被视为黑客,因为SQL缺少“导航”。

你所拥有的是一个简单的if语句。

for line in someRangeOfLines:
    for col in someRangeOfCols:
        try:
            cell= FooVal.objects().get( col = col, line = line )
        except FooVal.DoesNotExist:
            cell= None

这就是外连接的真正含义 - 尝试使用NULL替换进行查找。

唯一的优化类似于以下内容。

matrix = {}
for f in FooVal.objects().all():
    matrix[(f.line,f.col)] = f

for line in someRangeOfLines:
    for col in someRangeOfCols:
        cell= matrix.get((line,col),None)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top