0

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 の Database Lib を使用)

$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クエリを実行できる場合は避けたいと思います:)

4

2 に答える 2

2

私は1時間の「ヘッドバンギング」の後にこれを思いついた:

glasses = Code.objects.filter(glass__collection__item__discontinued=False)\
        .values('id', 'description')\
        .annotate(count=Count('glass__collection__item__id', distinct=True))
于 2012-07-03T23:56:33.597 に答える
0

SQL は絶対に使用しないでください。これは、ORM で問題にならない単純なクエリです。次のようなものを使用します。

Code.objects.filter(glass__item__discontinued=False) \
    .annotate(count=models.Count('glass__item__id'))

.values(...)PHP の例のように、特定の列のみを取得する場合は、末尾にa を追加できます。

于 2012-07-02T07:01:11.307 に答える