django-mptt dường như quyết tâm đẩy tôi ra khỏi tâm trí của tôi. Tôi đang cố gắng để làm một cái gì đó tương đối đơn giản: Tôi sẽ xóa một nút, và cần phải làm một cái gì đó hợp lý với trẻ em của nút. Cụ thể, tôi muốn di chuyển chúng lên một cấp độ để chúng là con của cha mẹ của cha mẹ hiện tại của chúng.django-mptt: làm thế nào để di chuyển thành công các nút xung quanh
Nghĩa là, nếu cây trông giống như:
Root
|
Grandpa
|
Father
| |
C1 C2
tôi sẽ xóa Cha, và muốn C1 và C2 là con của ông nội.
Dưới đây là đoạn code tôi đang sử dụng:
class Node(models.Model):
first_name = models.CharField(max_length=80, blank=True)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
def reparent_children(self, parent):
print "Reparenting"
for child in self.get_children():
print "Working on", child.first_name, "to parent", parent.email
parent = Node.objects.get(id=parent.id)
child.move_to(parent, 'last-child')
child.save()
Vì vậy, tôi muốn gọi:
father.reparent_children(grandpa)
father.parent = None
father.save()
này hoạt động - gần. Các em báo cáo các bậc phụ huynh như Grandpa:
c1.parent == grandpa # True
Grandpa đếm C1 và C2 ở trẻ em của nó
c1 in grandpa.children.all() # True
Tuy nhiên, gốc disowns những đứa trẻ.
c1.get_root() == father # c1's root is father, instead of Root
c1 in root.get_descendants() # False
Làm cách nào để các con di chuyển và thư mục gốc của chúng không bị hỏng?
bạn có chắc rằng "father.parent = Không" là đúng cách để xóa một nút? – mawimawi
Trong trường hợp này, tôi không thực sự xóa nút - tôi đang lưu trữ nó. Tôi muốn lấy nó ra khỏi cái cây. Bạn có một điểm tốt mặc dù, tôi không thực sự loại bỏ nó từ cây ở đây. – Parand
Có vẻ như đặt cha mẹ thành Không và lưu thực sự là cách để xóa nút khỏi cây (theo các trường hợp thử nghiệm mptt), vì vậy trông có vẻ đúng. – Parand