Как вывести определенные элементы из Базы Данных Python/Django?

Проект на Python/Django. В моем проекте пользователь вводит какие-то данные в форму. По нажатию кнопки данные сохраняются в бд, и пользователю открывается страница с результатами, где выводятся данные, которые он ввел. Я вывожу эти данные так: views.py

def results(request):
    data_f_name = ModifiedFile.objects.order_by('-file_name')
    data_f_path = ModifiedFile.objects.order_by('-file_full_path')
    data_f_status = ModifiedFile.objects.order_by('-file_status')
    data_f_sal = ModifiedFile.objects.order_by('-file_stats_add_lines')
    data_f_sdl = ModifiedFile.objects.order_by('-file_stats_delete_lines')
    data = {
        
        'data_f_name': data_f_name,
        'data_f_path': data_f_path,
        'data_f_status': data_f_status,
        'data_f_sal': data_f_sal,
        'data_f_sdl': data_f_sdl
    }
    return render(request, 'integrate/results.html', data)

models.py:

class ModifiedFile(models.Model):
    commit_hash = models.ForeignKey(Commit, verbose_name='Принадлежат коммиту',        on_delete=models.CASCADE, blank=True)

    count_files = models.PositiveIntegerField('Количество измененных файлов', default=0)
    # name of the modified file
    file_name = models.TextField('Имя файла', blank=True)
# full path to the file
    file_full_path = models.TextField('Полный путь', blank=True)
# file change status
    file_status = models.TextField('Статус', blank=True)
# total number of rows added
    file_stats_add_lines = models.TextField('Количество добавленных строк', blank=True)
# total number of deleted rows
    file_stats_delete_lines = models.TextField('Количество удаленных строк', blank=True)

    def __str__(self):
        return str(self.file_name)

    class Meta:
        verbose_name = 'GitHub - изменения'
        verbose_name_plural = 'GitHub - модифицированные файлы'

Собственно проблема в чем. Если после ввода одним пользователем ввести свои данные другим, то если я хочу вывести результат, методомobjects.order_by и указав поля, на вывод поступят вообще все данные, которые есть, а не те, которые я только что ввел. Подскажите, как можно это реализовать? Я пытался запомнить количество записей, которые вносятся в бд при нажатии кнопки, например при первой итерации ввода вносятся 10 записей. При второй итерации - 15 записей. Всего в бд записей будет 25. Если я хочу вывести только те записи, которые вводил второй пользователь, (но я знаю, что он вводил последний, и количество введенных записей 15), мне надо с конца вывести первые 15 записей, как это сделать? Я пытался сделать так: в базу данных я сохраняю количество записей, который ввел пользователь. В бд это число хранится как int. Дальше я присваиваю переменной это значение из бд:

a = TotalIteration.objects.last()
data_f_name = ModifiedFile.objects.order_by('-file_name')[:int(a)]

Мне выдает ошибку:

Аргумент int () должен быть строкой, байтовым объектом или числом, а не TotalIteration. Тогда я попробовал по другому:

a = str(TotalIteration.objects.last())
b = int(a)
data_f_name = ModifiedFile.objects.order_by('-file_name')[:b]

И это работает, но только тогда, когда в базе данных есть хотя бы 1 запись, т.е. TotalIteration.objects - квери сет, где изначально ничего нет. И если я как новый пользователь, который вообще в первый раз просто перейдет на страницу с результатами, то выскакивает ошибка

invalid literal for int() with base 10: 'None'

в базе данных нет отметок, что кто-то вносил данные, значит в бд в поле "количество итераций" ничего нет, и когда идет проверка, то возникает это ошибка. Как это исправить? Либо есть какой-то альтернативный способ, как вывести определенные объекты из бд, как я хотел - например первые 15 с конца?

Помогите пожалуйста, я новичок в Python/Django.


Ответы (1 шт):

Автор решения: Sergei Malanin

Думаю что во первых вам необходимо расширить вашу модель и добавить туда поля для пользователя и таймстемп записи.
Примерно так:

from django.contrib.auth.models import User

class ModifiedFile(models.Model):
    commit_hash = models.ForeignKey(Commit, verbose_name='Принадлежат коммиту',        on_delete=models.CASCADE, blank=True)

    count_files = models.PositiveIntegerField('Количество измененных файлов', default=0)
    # name of the modified file
    file_name = models.TextField('Имя файла', blank=True)
# full path to the file
    file_full_path = models.TextField('Полный путь', blank=True)
# file change status
    file_status = models.TextField('Статус', blank=True)
# total number of rows added
    file_stats_add_lines = models.TextField('Количество добавленных строк', blank=True)
# total number of deleted rows
    file_stats_delete_lines = models.TextField('Количество удаленных строк', blank=True)
    #
    # Добавил вот эти
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    timestamp = models.DateTimeField(auto_now=True,)
    def __str__(self):
        return str(self.file_name)
  
    class Meta:
        verbose_name = 'GitHub - изменения'
        verbose_name_plural = 'GitHub - модифицированные файлы'

После этого вы сможете фильтровать ваши записи по пользователю и сортировать хронологически используя добавленые поля.

P.S. Можно создать отдельную модель BasicUser Подробнее тут

from django.contrib.auth.models import AbstractUser

class BasicUser(AbstractUser):
    pass

Лучше отнаследоваться от User что бы когда захочется добавить какие нибудь кастомные поля для пользователя вы не рефакторили весь код. В settings.py нужно будет добавить следующее:

AUTH_USER_MODEL=my_app.BasicUser

my_app замените на ваше приложение(app в терминологии Django) Но если не предвидится изменения модели User(что маловероятно) то можно обойтись и без этого.

→ Ссылка