this question과 비슷하지만 그 중 아무 것도 이상적이지 않습니다.데이터베이스 테이블의 정렬 순서 열을 사용하는 대신
class Parent(models.Model):
id = models.AutoField(primary_key=True)
class Child(models.Model):
id = models.AutoField(primary_key=True)
parent = models.ForeignKey(Parent)
SQL에서 (내가 바로이 코드를 가지고 희망) :
CREATE TABLE parent (
id integer PRIMARY KEY
);
CREATE TABLE child (
id integer PRIMARY KEY
parent_id integer REFERENCES parent
);
이 Child
객체가 특정에 속하는 그래서 할 수있는 방법
PostgreSQL의 사용이 장고 모델을 고려 Parent
은 재정렬 할 수 있습니까? 드래그 드롭 UI를 사용하여 사용자는 Child
을 드래그하여 업데이트 된 순서를 저장할 수 있습니다. Child
을 생성, 업데이트 및 삭제하는 작업은 한 번만 수행하면됩니다. 즉, Parent
에서 무언가를 업데이트하지 않아도됩니다. 각 아이디어는 좋지 않은 이유
나는 이유를 몇 가지 불완전한 아이디어를 가지고 : 정렬
순으로 사용자가 제공하는 VARCHAR와
Child
- 이것은 특정 문자로 시작하는 이름을 생각하는 사용자를 강제로 정당한 사유가 없더라도 스트레스가 많은 창의력이 요구됩니다.Parent
에서,
Child
객체의 기본 키에 대응하는 정수 배열을 스토어 - 생성 및 삭제를위한 하나 개 이상의 연산을 필요Parent
의 배열마다 갱신 될 필요가있을 것이다. 데이터 무결성을 보장하는 데이터베이스가 없습니다.정수 열로 정렬
Child
을 만들 때 추가 읽기가 필요하므로 사용할 다음 정수를 찾으십시오. 또 다른 문제는 (생산 과정에서 발생할 가능성이 거의 없음에도 불구하고) 정수 사이의 간격이 없어지면 삽입 된 객체의 "뒤에"있는 객체를 밀어 넣어야한다는 것입니다. 이 상황은 반복적으로 마지막 개체를 가져 와서 처음부터 처리함으로써 인위적으로 강제 될 수 있습니다.각
Child
에서 다음/이전Child
을 참조하는 정수 ID를 저장합니다. - 이것은 3의 해킹 문제를 해결하지만, 불합리하게 비효율적이며 병참 문제로 보입니다. (부가 가입 포함 또는jsonb
와 두 번째 테이블을 교체하지 않음)이 요구 사항에 대한 웅변 솔루션은
3을 사용하십시오. 설명하는 문제는 실제로 발생하지만 부모 당 실제로 많은 수의 자녀가없는 한 중요하지는 않습니다. –