我有这三个模型:
class Track(models.Model):
title = models.TextField()
artist = models.TextField()
class Tag(models.Model):
name = models.CharField(max_length=50)
class TrackHasTag(models.Model):
track = models.ForeignKey('Track', on_delete=models.CASCADE)
tag = models.ForeignKey('Tag', on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)
我想要检索所有未标记特定标记的曲目.这让我得到了我想要的东西:Track.objects.exclude(trackhastag__tag_id='1').only('id')但是当桌子增长时它会很慢.这是我在打印查询.query集时得到的:
SELECT "track"."id"
FROM "track"
WHERE NOT ( "track"."id" IN (SELECT U1."track_id" AS Col1
FROM "trackhastag" U1
WHERE U1."tag_id" = 1) )
Run Code Online (Sandbox Code Playgroud)
我希望Django发送此查询:
SELECT "track"."id"
FROM "track"
LEFT OUTER JOIN "trackhastag"
ON "track"."id" = "trackhastag"."track_id"
AND "trackhastag"."tag_id" = 1
WHERE "trackhastag"."id" IS NULL;
Run Code Online (Sandbox Code Playgroud)
但还没有找到办法.使用原始查询实际上不是一个选项,因为我必须经常过滤生成的查询集.
我已经找到了干净的解决方法是在数据库中创建一个视图和模型TrackHasTagFoo用managed = False,我用它来查询,如:Track.objects.filter(trackhastagfoo__isnull=True) …
我正在尝试在按另一列分组之后逐个元素地添加数组列元素。
有下表A:
id units
1 [1,1,1]
2 [3,0,0]
1 [5,3,7]
3 [2,5,2]
2 [3,2,6]
Run Code Online (Sandbox Code Playgroud)
我想查询如下内容:
select id, sum(units) from A group by id
Run Code Online (Sandbox Code Playgroud)
并得到以下结果:
id units
1 [6,4,8]
2 [6,2,6]
3 [2,5,2]
Run Code Online (Sandbox Code Playgroud)
具有相同 id 的行中的单位数组逐个元素添加。