Запросить список с верхними N элементами в каждой группе - PullRequest
0 голосов
/ 14 февраля 2020

Допустим, у меня есть две модели:

class Result(models.Model):
    b = foreignKey(ModelB)

class ModelB(models.Model):
    code = models.CharField(...)

Мне нужно сохранить только N последних результатов, связанных с каждой модельюb, и удалить остальные. В таблице ModelB и Result действительно может быть много записей. Есть ли способ, которым я могу выполнить это с django ORM без необходимости создавать al oop?

[Редактировать] - Пример :

ModelB objs: [(1, [result1, result2, result3, result4]), (2, [result10, result11, result12])]

Result objs: [(result1), (result2), (result3), (result4), (result10), (result11), (result12)]

Давайте скажем, я хочу сохранить только 2 последних результата из подмножества каждого Modelb, остальные должны быть следующие

ModelB objs:  [(1, [result4, result3]), (2, result12, result11)]
Result objs: [(result3), (result4), (result11), (result12)]

1 Ответ

0 голосов
/ 14 февраля 2020

Я бы добавил поле created к моделям, чтобы вы знали, когда был создан объект. Затем вы можете заказать это, чтобы найти последние N экземпляры.

class Result(models.Model):
    b = foreignKey(ModelB)
    created = models.DateTimeField(auto_now_add=True)
    # modified = models.DateTimeField(auto_now=True)

    class Meta:
        get_latest_by = "created"

Что касается удаления объектов, вы можете сделать что-то вроде:

n = 10
results = Result.objects.all().count()

if results > n:
    all_results = Result.objects.all()
    keep = all_results[n:]
    keep_ids = keep.values_list('id', flat=True)
    all_results.exclude(id__in=keep_ids).delete()

Это, вероятно, также стоит отмечая атрибут get_latest_by мета-модели, который позволяет вам определить, как идентифицировать самый новый экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...