2013-02-01 4 views
0

내가 항목을 나타내는 장고 모델을 가지고, 각각의 하나는 그와 같은 특정 그룹에 저장할 수 있습니다 :상대 자동 증분 ID

+----+----------+-----+--------+ 
| 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로 전환해야하기 때문에 장고 추상 레이어를 사용하는 솔루션을 찾고 싶습니다.

답변

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 

그리고 Fiddle.

행운을 빈다.

+0

정확하게는 아닙니다. 행을 삭제하는 경우 : http://www.sqlfiddle.com/#!1/94540/1 마지막 행에 4가 아닌 RN 5가 있어야합니다. 테이블에 값을 저장하고 생성해야합니다. 새로운 엔트리가 추가 될 때. – user2031043

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>

그 것처럼 보입니다.
첫 번째 save()은 자동 생성 된 ID를 가져오고이 경우 으로 두 번째 save() 업데이트 레코드를 가져 오며이 경우 number이라고합니다.
id_lte를 사용하여 필터링
은 경쟁 조건을 제거하는 데 사용됩니다.