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

#django #django-views #django-database

#django #django-представления #django-база данных

Вопрос:

У меня возникают трудности с пониманием того, как лучше структурировать мои представления. Я извлекаю данные о различных пользователях и создаю переменные, которые суммируют некоторые из этих переменных (например, количество посещений в неделю и т.д.). Это делается для того, чтобы я мог отображать эти сводные переменные в своих шаблонах. Я выполняю довольно много различных манипуляций, которые становятся довольно запутанными, и мне понадобятся эти манипуляции для других шаблонов. Может кто-нибудь порекомендовать, как лучше структурировать представления в этом случае. Я думаю, что использование классов — это решение для использования тех же функций для других шаблонов, но я не совсем понимаю, как. Я также чувствую, что должен быть лучший способ структурировать каждую манипуляцию с данными базы данных.

 def dashboard(request):

    posts= Post.objects.filter(user=request.user)
    posts_count = posts.count()
    post_early = Post.objects.filter(user=request.user).earliest('date')   #need to extract the date value from this so I can take the difference

    total_days = (datetime.datetime.now().date()- post_early.date).days

    average_30days= round((posts_count/total_days)*30,2)

    list4=[]
    list5=[]
    i=1
    time3=datetime.datetime.now()   datetime.timedelta(-30)

    while i<32:

        list4.append(days2(time3,request,Post))
        list5.append(time3.strftime('%b %d, %Y'))
        i =1
        time3=time3   datetime.timedelta( 1)
  

Ответ №1:

 def dashboardView(request):
    posts = Post.objects.filter(user=request.user)
    posts_count = posts.count()
    #need to extract the date value from post_early so I can take the difference
    post_early = Post.objects.filter(user=request.user).earliest('date')   
    total_days = (datetime.datetime.now().date() - post_early.date).days
    average_30days = round((posts_count/total_days)*30,2)
    list_4 = []
    list_5 = []
    i = 1
    time_3=datetime.datetime.now()   datetime.timedelta(-30)

    while i<32:
        list_4.append(days2(time_3, request, Post))
        list_5.append(time_3.strftime('%b %d, %Y'))
        i  = 1
        time_3 = time_3   datetime.timedelta(1)
  

Я бы сделал что-то вроде этого. Было несколько несоответствий:

-сохраняйте пробел перед операторами и пробел после них (=, *, -, , …).

-Я бы счел хорошей практикой всегда добавлять суффикс -View к вашим представлениям, но это просто личные предпочтения

-Используйте пустые строки для разделения блоков кода, а не групп переменных. Если у вас есть длинный список объявлений переменных (не в этом случае), вы можете использовать комментарии, чтобы разделить и классифицировать их.

-Используйте list_3 вместо list3 (и подобных случаев), это более читабельно.

Для получения дополнительной информации вы всегда можете ознакомиться с официальным руководством по стилю python:https://www.python.org/dev/peps/pep-0008

В любом случае, если вы будете последовательны и придерживаетесь стиля кодирования, используемого в документации Django во время обучения, у вас все будет в порядке.

##### РЕДАКТИРОВАТЬ:

Примечание: мой ответ основан на предоставленном вами коде, который кажется сокращенным (без инструкции return?) и без других модулей.

Вы используете представление на основе функций, которое не является ни неправильным, ни правильным, просто одним из возможных вариантов. Если вам это не нравится или вы хотите попробовать что-то другое, вам может подойти ListView: https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display

Пример:

 from django.views import ListView

class DashboardView(ListView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['posts'] = Post.objects.filter(user=request.user)
        # add all the data you need to the context dictionary
    return context
  

Комментарии:

1. это вообще не отвечает на мой вопрос. Я спрашиваю о структуре, использующей классы, другие любые другие параметры, а не межстрочный интервал и соглашения об именовании.

2. Тогда извините, я думал, вы спрашиваете, как организовать свой код (что определенно не повредило бы в этом случае и помогло бы избежать беспорядка. Я попытаюсь ответить на ваш вопрос, отредактировав свой предыдущий ответ.