我有来自Kohana的这个代码(很容易理解)我希望在给定ff的情况下将其转换为Django ORM。机型:
class Item(models.Model):
glasses = models.ManyToManyField(Glass, through="ItemGlass")
collection = models.ForeignKey(Collection)
class ItemGlass(models.Model):
glass = models.ForeignKey(Glass)
item = models.ForeignKey(Item)
class Collection(models.Model):
name = models.CharField(max_length=100)
class Code(models.Model):
code = models.CharField(max_length=30)
description = models.TextField()
class Glass(models.Model):
collection = models.ForeignKey(Collection)
code = models.ForeignKey(Code)
和php查询(使用Kohana的数据库库)
$this->select(
array('cd.id', 'id'),
array('cd.description','description'),
array('COUNT(DISTINCT("items.id"))', 'count')
)
->from('items')
->join(array('collections', 'c'))
->on('c.id', '=', 'items.collection_id')
->join(array('glasses', 'g'))
->on('g.collection_id', '=', 'c.id')
->join(array('code', 'cd'))
->on('cd.id', '=', 'g.code_id')
->where('items.discontinued', '=', FALSE)
->group_by('cd.id');
注意:您看到的“数组”子句翻译为
"SELECT cd.id AS id, cd.description AS description, COUNT(DISTINCT(items.id) AS count"
问题是我该怎么办?在这种情况下,我无法成功使用select_related连接多个表,我找不到查询的好“过滤技巧”。有什么想法吗?
编辑:我正在考虑在纯SQL中进行此操作,但如果可以执行Django ORM查询,我宁愿避免使用它:)
答案 0 :(得分:2)
经过一个小时的“敲头撞击”后,我想出了这个:
glasses = Code.objects.filter(glass__collection__item__discontinued=False)\
.values('id', 'description')\
.annotate(count=Count('glass__collection__item__id', distinct=True))
答案 1 :(得分:0)
绝对不要使用SQL,这是一个简单的查询,ORM应该没有问题。使用类似的东西:
Code.objects.filter(glass__item__discontinued=False) \
.annotate(count=models.Count('glass__item__id'))
如果您只想检索特定列,可以在其末尾添加.values(...)
,如php示例所示。