2013-05-10 32 views
9

Hãy nói ví dụ tôi có một mô hình gọi là "Client" và một mô hình gọi là "PHONENUMBERS"dạng Django với lĩnh vực ManyToMany với 500.000 đối tượng lần ra

class PhoneNumbers(models.Model): 
    number = forms.IntegerField() 

class Client(models.Model): 
    number = forms.ManyToManyField(PhoneNumbers) 

Khách hàng có mối quan hệ với ManyToMany PHONENUMBERS. PhoneNumbers có gần 500.000 bản ghi trong đó vì vậy khi nói đến chỉnh sửa bản ghi Khách hàng từ một mẫu biểu mẫu với một tiện ích MultiSelect đi kèm với một M2M nộp, phải mất mãi mãi để tải. Trong thực tế, nó không bao giờ làm. Nó chỉ ngồi đó cố gắng để tải tất cả các đối tượng điện thoại tôi giả định.

Cách giải quyết của tôi là một số điều tẻ nhạt với ajax và jquery để chỉ chỉnh sửa số điện thoại trong bản ghi Khách hàng. Trước khi lãng phí thời gian của tôi với tất cả những gì tôi muốn xem nếu có bằng cách nào đó một cách khác để đi về nó mà không có trang của tôi treo.

Trả lời

5

Bạn cần tạo tiện ích con tùy chỉnh cho trường này cho phép bạn tự động hoàn tất cho bản ghi chính xác. Nếu bạn không muốn tự cuộn của riêng mình: http://django-autocomplete-light.readthedocs.io/

Tôi đã sử dụng tính năng này để hỗ trợ mối quan hệ chung, tính năng tự động hoàn thành M2M trông khá dễ dàng và trực quan. xem video sử dụng tại đây: http://www.youtube.com/watch?v=fJIHiqWKUXI&feature=youtu.be

Sau khi đọc nhận xét của bạn về việc cần nó bên ngoài quản trị viên, tôi đã xem một thư viện django-autocomplete-light khác. It provides widgets you can use outside the admin.

from dal import autocomplete 
from django import forms 

class PersonForm(forms.ModelForm): 
    class Meta: 
     widgets = { 
      'myformfield': autocomplete.ModelSelect2(
       # ... 
      ), 
     } 
+0

Cảm ơn bạn rất nhiều vì đã cập nhật. Tôi đang sử dụng một modelformset_factory sử dụng Django 1.3 mà tôi không tin cho phép 'widget' kwarg được thông qua nhưng tôi sẽ cố gắng thực hiện bằng cách nào đó và cho bạn biết kết quả. – Austin

+0

modelformset_factory có một đối tượng biểu mẫu tùy chọn. 'myModelFormset = modelformset_factory (Tác giả, form = AuthorForm)' xem: http://stackoverflow.com/questions/2853350/using-a-custom-form-in-a-modelformset-factory và https: //docs.djangoproject. com/en/1.5/ref/forms/models/# django.forms.models.modelformset_factory –

4

Hết hộp, quản trị viên mẫu có tùy chọn raw_id_fields cho phép tải trang của bạn nhanh hơn nhiều. Tuy nhiên, giao diện người dùng của các trường id thô không phải là rất trực quan, vì vậy bạn có thể phải cuộn giải pháp của riêng mình.

+2

Yup, sẽ hoàn hảo, tốt thôi, nếu tôi chỉ cần nó trong quản trị. Tuy nhiên tôi yêu cầu nó nằm trong một khuôn mẫu bên ngoài admin. – Austin

0

Chúng tôi sử dụng phụ tùng bên thứ 3 này cho việc này:

https://github.com/crucialfelix/django-ajax-selects

Btw, 'dụ' bạn ở trên là thiết kế DB thực sự tồi tệ cho một loạt các lý do. Bạn chỉ nên có số điện thoại như một trường văn bản trên mô hình Khách hàng và sau đó bạn sẽ không có vấn đề nào trong số này. ;-)

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