Запрос первого объекта из всех объектов, связанных с пользователем, в Django
У меня есть модель django, как показано ниже:
class Books:
name = models.CharField(max_length=255)
author = models.ForeignKey(User, on_delete=models.CASCADE)
timeStamp = models.DateTimeField(auto_now_add=True)
first = models.BooleanField(default=False)
У меня уже есть около миллиона записей в таблице Books
и недавно я добавил поле first
. Теперь я хочу обновить поле first
первого созданного объекта каждого пользователя на True.
all = Books.objects.all()
li = []
for i in all:
if i.user.username not in li:
i.first = True
i.save()
li.append(i.user.username)
Я попробовал следующую функцию, но она занимает так много времени на выполнение, при этом в ней много данных. Есть ли более быстрый способ? Попробовал метод bulk_update
, для этого также нужно завершить цикл.
Поскольку вы используете PostgreSQL, вы можете вызвать .distinct() для определенного столбца, а затем использовать метод queryset .update() для обновления всех столбцов до одного значения, что должно быть намного быстрее.
Books.objects.all().order_by('timeStamp').distinct('author').update(first=True)
Код выше сначала упорядочивает набор запросов по полю timeStamp
, после чего вызывает distinct на колонке author, оставляя только первую отличительную строку (самую раннюю) и в конце обновляет значение колонки.