Запрос первого объекта из всех объектов, связанных с пользователем, в 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, оставляя только первую отличительную строку (самую раннюю) и в конце обновляет значение колонки.

Вернуться на верх