我有一个表示项目的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,但我想找到一个使用django抽象层的解决方案,因为我以后必须切换到MySQL。
答案 0 :(得分:0)
这是您正在寻找的 - 一种创建rel_id列的方法吗?这应该适用于PostgreSQL:
SELECT Id,
Group_Id,
Row_Number() OVER (PARTITION BY Group_ID ORDER BY Id) rn
FROM YourTable
ORDER BY Id
这是Fiddle。
这适用于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
祝你好运。
答案 1 :(得分: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>
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>
用于消除竞争条件。