0

アイテムを表すdjangoモデルがあり、それぞれを次のように特定のグループに保存できます。

+----+----------+-----+--------+
| id | group_id | ... | rel_id |
+----+----------+-----+--------+
|  1 |        1 | ... |      1 |
|  2 |        1 | ... |      2 |
|  3 |        2 | ... |      1 |
|  4 |        2 | ... |      2 |
|  5 |        1 | ... |      3 |
|  6 |        3 | ... |      1 |
|  7 |        1 | ... |      4 |
|  8 |        1 | ... |      5 |
+----+----------+-----+--------+

rel_id何らかの方法でその値を生成して保存する必要があります。

したがって、基本的にはこことまったく同じものが必要です: Relative incremental ID by reference fieldですが、テーブルの内容を操作する必要があるため (削除、更新、テーブルのスライスのフェッチなど)、動的計算は私には適していません。 )。

これを行う最善の方法は何ですか?

現在、PostgreSQL を使用していますが、後で MySQL に切り替える必要があるため、django 抽象レイヤーを使用するソリューションを見つけたいと考えています。

4

2 に答える 2

0

これはあなたが探しているものですか?rel_id列を作成する方法ですか?これはPostgreSQLで機能するはずです。

SELECT Id, 
  Group_Id, 
  Row_Number() OVER (PARTITION BY Group_ID ORDER BY Id) rn
FROM YourTable
ORDER BY Id

これがフィドルです。

これはMySQLで機能するはずです:

SELECT ID, Group_Id, RowNumber
FROM (
  SELECT Id, Group_ID,
    @row_num := IF(@prev_value=Group_Id,@row_num+1,1) AS RowNumber
     ,@prev_value := Group_Id as groupRowNumber
  FROM YourTable,
     (SELECT @row_num := 1) x,
     (SELECT @prev_value := '') y
  ORDER BY Group_ID
) t

そしてフィドル

幸運を。

于 2013-02-01T02:05:15.087 に答える
0

 

class Item(models.Model): group = models.ForeignKey(Group) number = models.IntegerField() def save(self, force_insert=False, force_update=False, using=None): super(Item, self).save(force_insert = force_insert, force_update = force_update, using = using) self.number = Item.objects.filter(group = self.group).filter(id__lte = self.id).count() super(Item, self).save(force_insert = force_insert, force_update = force_update, using = using) </pre> </code>

That seems to work.
First save() fetches auto generated id, second save() updates record with rel_id, called number in this case.
Filtering with id_lte
競合状態を解消するために使用されます。

于 2013-02-01T12:14:16.430 に答える