Django中的外连接建模

0 投票
1 回答
829 浏览
提问于 2025-04-15 13:17

我有一个多对多关系的表,里面有一些数据在连接的基础上。

我的模型的基本版本看起来像这样:

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表,并且对于那些没有填写的值显示为null)。一个典型的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模型来实现上面的查询?

谢谢!

1 个回答

0

外连接可以被看作是一种变通的方法,因为SQL没有“导航”功能。

你可以把它理解为一种简单的条件判断。

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)

撰写回答