WedX - журнал о программировании и компьютерных науках

Как взвесить количество наборов запросов данных для политики подкачки?

У меня есть модель пользователя с полем 20 count:

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 я хочу использовать Paginator для реализации пейджинга для списка пользователей.

Потому что количество моих пользователей в моей базе данных не превышает 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)

И я не знаю, является ли этот метод (запросить все строки пользовательских данных) неэффективным.

Или как взвесить баланс запроса пользователей из базы данных? Для положительных предельных чисел (по количеству я должен изменить метод разбивки на страницы, меньше, чем я могу использовать свой метод страницы)?

Или есть лучший способ разбить моих пользователей на страницы?

20.10.2017

  • Непонятно, что вы считаете неправильным в этом. Вот как вы должны использовать пагинаторы. И это не извлекает все строки ваших пользователей. 20.10.2017
  • Вы имеете в виду, что мой метод используется правильно и эффективно? потому что я думаю, что использование models.User.objects.all() извлечет все данные пользователей из моей базы данных. Вы имеете в виду, что он извлекает только 10 (page_size) строк пользовательских данных? если, как вы говорите, как Paginator может это реализовать? 20.10.2017
  • Наборы запросов ленивы; User.objects.all() на самом деле не выполняет запрос. 20.10.2017
  • @DanielRoseman, так что мой метод лучше всего. нет необходимости оптимизировать 20.10.2017

Ответы:


1

Общий ListView приносит paginator. Вы должны убедиться, что ваш набор запросов отсортирован, иначе страницы могут повторять некоторые объекты (это не проблема 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_orphans, paginator_class и т. д.

20.10.2017
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]