2017-10-20 63 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