Django中的外连接建模
我有一个多对多关系的表,里面有一些数据在连接的基础上。
我的模型的基本版本看起来像这样:
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)