2017-10-20 7 views
0

私は20カウント・フィールドがあるUserモデルがあります:ページング・ポリシーのデータ・クエリーセット・カウントの重み付けは?

class User(models.Model): 

    username = models.CharField(max_length=16) 
    password = models.CharField(max_length=40) # sha1 
    real_name = models.CharField(max_length=12, null=True,blank=True) 
    phone = models.CharField(max_length=11) 
    email = models.EmailField(blank=True, null=True) 
    qq = models.CharField(max_length=10, null=True, blank=True) 
    address = models.CharField(max_length=64, blank=True, null=True) 
    id_card = models.CharField(blank=True, null=True, max_length=18, validators=[RegexValidator(regex='^.{18}$', message='身份证长度必须为18', code='nomatch')]) 
    id_card_img_front = models.CharField(max_length=256, blank=True, null=True) 
    id_card_img_back = models.CharField(max_length=256, blank=True, null=True) 
    nickname = models.CharField(max_length=16, blank=True, null=True) 
    profile = models.CharField(max_length=256, blank=True, null=True, default=' ') 
    usertype = models.ForeignKey(to='UserType', default=1, blank=True) 

    user_c_type = models.CharField(max_length=4, null=True) 
    fixed_phone = models.CharField(max_length=16, null=True) 
    fax = models.CharField(max_length=16, null=True) 
    main_bussiness = models.CharField(max_length=16, null=True) 
    main_industry = models.CharField(max_length=16, null=True) 
    company_name = models.CharField(max_length=32, null=True) 
    company_address = models.CharField(max_length=32, null=True) 
    province = models.CharField(max_length=32, null=True, default="--省--") 
    town = models.CharField(max_length=32, null=True, default="--市--") # 省市县 
    country_level = models.CharField(max_length=32, null=True, default="--县--") 

    ctime = models.DateTimeField(auto_now_add=True) 
    uptime = models.DateTimeField(auto_now=True)  
    status = models.CharField(max_length=1, null=True, default=1) 

そして、私のDjangoプロジェクトでは、私は、ユーザーリストのページングを実現するためにページネータを使用したいです。

データベース内のユーザーの数が10,000行を超えないためです。

だから、私は自分のデータベースのすべてのユーザーを取得して、それらを改ページすることができますか?

user_all = models.User.objects.all() 
paginator = Paginator(user_all, 10) 

try: 
    user_list_page = paginator.page(page_number) 
except PageNotAnInteger: 
    user_list_page = paginator.page(1) 
except EmptyPage: 
    user_list_page = paginator.page(paginator.num_pages) 

この方法(ユーザーデータのすべての行を照会)が非効率であるかどうかはわかりません。

または、データベースからユーザーを照会するバランスをとるにはどうしたらいいですか?正の限界数(数を超えて、私はページメソッドを使うことができるよりも少ないページ分割メソッドを変更する必要があります)?

また、ユーザーを改ページする方法がありますか?

+0

これについて間違っていると思われることは明確ではありません。それがあなたがページャーを使う方法です。そして、それはあなたのユーザーのすべての行を取得していません。 –

+0

私の方法を正確かつ効率的に使用することを意味しますか?私は 'models.User.objects.all()'を使用してデータベースからすべてのユーザーデータを取得すると思うからです。つまり、10(page_size)行のユーザーデータを取得するだけですか?あなたが言うように、Paginatorはこれをどのように実装できますか? – aircraft

+0

Querysetは遅延です。 'User.objects.all()'は実際にはクエリを実行しません。 –

答えて

0

汎用ListViewには改ページがあります。クエリセットがソートされていることを確認する必要があります。そうしないと、ページがオブジェクトの一部を繰り返してしまうことがあります(これはDjangoの問題ではありません - ソート順のないページングは​​現実的ではありません)。

https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-display/#listview

from django.views.generic.list import ListView 

class UserListView(ListView): 
    template = 'my_user_list_template.html' 
    model = User # not django.contrib.User but your's 
    paginate_by = 10 

    def get_queryset(self): 
     return super().get_queryset().order_by('realname', 'pk') 

テンプレートは、現在のページの改ページをレンダリングするために必要なすべてのコンテキストデータ、および最大10個のオブジェクトが含まれます。 https://github.com/jamespacileo/django-pure-pagination

その他のリンク: https://docs.djangoproject.com/en/1.11/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.paginate_by も参照してください同じページ:paginate_orphanspaginator_classなど

ページネーションリンク内の他のGETパラメータを可能にするために改ページを拡張pure_paginationのようなサードパーティ製のモジュールがあります。