2017-10-20 91 views
0

我有了20的計數域用戶模式:如何權衡尋呼策略的數據查詢集計數?

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

目前還不清楚你認爲這是錯誤的。這就是你應該如何使用paginators。它不會提取用戶的所有行。 –

+0

您的意思是使用我的方法是正確和有效的嗎?因爲我認爲使用'models.User.objects.all()'會從我的數據庫中獲取所有的用戶數據。你的意思是它只獲取10(page_size)行用戶數據?如果像你說的那樣,Paginator如何實現這一點? – aircraft

+0

查詢集很懶; '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個對象當前頁面。

有喜歡pure_pagination第三方模塊擴展了分頁,以便在分頁鏈接其他GET參數: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