2009-01-09 56 views
12

tôi có vấn đề rất đơn giản. Tôi cần tạo mô hình, đại diện cho yếu tố của danh sách được sắp xếp. Mô hình này có thể được thực hiện như thế này:Danh sách được sắp xếp theo thứ tự django

class Item(models.Model): 
    data = models.TextField() 
    order = models.IntegerField() 

hay như thế này:

class Item(models.Model): 
    data = models.TextField() 
    next = models.ForeignKey('self') 

cách gì được ưa chuộng? Những hạn chế có từng giải pháp?

+0

Xin chào! Tôi gặp rắc rối tương tự với cùng một vấn đề. Một giải pháp tôi nghĩ là sử dụng mô hình trong 'giải pháp 1' của bạn. Nhưng thay vì di chuyển mọi thứ, tôi chỉ thay đổi giá trị của 'mục được sắp xếp lại'. Ví dụ: tôi muốn di chuyển một Mục ở giữa các mục có thứ tự 9 và 10, tôi sẽ chỉ thay đổi thứ tự của mục thành 9,5. Bạn có nghĩ rằng điều này có thể xấu cho các bảng dài không? –

Trả lời

20

Về cơ bản, giải pháp thứ hai bạn đề xuất là danh sách được liên kết. Danh sách liên kết được triển khai ở cấp cơ sở dữ liệu thường không phải là một ý tưởng hay. Để truy xuất danh sách các thành phần n, bạn sẽ cần truy cập cơ sở dữ liệu n (hoặc sử dụng truy vấn phức tạp). Hiệu suất khôn ngoan, lấy một danh sách trong O (n) là hết sức không hiệu quả.

Trong mã thông thường, danh sách liên kết được sử dụng để có hiệu suất chèn tốt hơn so với mảng (không cần di chuyển tất cả các phần tử xung quanh). Trong cơ sở dữ liệu của bạn, cập nhật tất cả các yếu tố mà không phải là phức tạp chỉ trong 2 truy vấn:

UPDATE item.order = item.order + 1 FROM item WHERE order > 3 
INSERT INTO item (order, ...) VALUES (3, ...) 

Tôi nhớ nhìn thấy một ứng dụng reuseable mà thực hiện tất cả những gì và một giao diện quản trị tốt đẹp, nhưng tôi không thể tìm thấy nó ngay bây giờ ...

Để tóm tắt, hãy sử dụng giải pháp # 1 một cách chắc chắn và tránh xa giải pháp # 2 trừ khi bạn có lý do rất tốt để không!

+0

Đây có phải là ứng dụng bạn đã đề cập không? http://nyquistrate.com/django/orderedlist/ –

+0

Hai thư viện khác giúp quản lý trường "order" trên mô hình Django là https://pypi.python.org/pypi/django-positions/ và https://pypi.python.org/pypi/django-ordered-model/. Vị trí Django có vẻ tốt hơn trong nháy mắt. – Nathan

6

Điều đó tùy thuộc vào những gì bạn muốn làm.

Người đầu tiên có vẻ tốt hơn để thực hiện một truy vấn duy nhất trong cơ sở dữ liệu và nhận được tất cả dữ liệu theo đúng thứ tự

thứ hai dường như tốt hơn để chèn một phần tử giữa hai yếu tố hiện có (vì trong một đầu tiên bạn' d phải thay đổi nhiều mục nếu các số là tuần tự)

Tôi muốn sử dụng cái đầu tiên, vì nó có vẻ phù hợp với bảng cơ sở dữ liệu.

-6

Có một giải pháp khác.

class Item(models.Model): 
    data = models.TextField() 

Bạn chỉ có thể chọn hoặc sắp xếp danh sách Python vào trường dữ liệu và tải nó lên. Cái này tốt cho việc cập nhật và đọc, nhưng không tốt cho việc tìm kiếm, ví dụ: tìm nạp tất cả các danh sách chứa một mục cụ thể.

Các vấn đề liên quan