Как вывести определенные элементы из Базы Данных 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 шт):
Думаю что во первых вам необходимо расширить вашу модель и добавить туда поля для пользователя и таймстемп записи.
Примерно так:
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(что маловероятно) то можно обойтись и без этого.