簡體   English   中英

查詢每組中前 N 個元素的列表

[英]Query a list with the top N elements in each group

假設我有兩個模型:

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

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

我需要的是只保留與每個modelb相關的N個最新結果並刪除rest。表ModelB和Result確實可以有很多記錄。 有沒有一種方法可以使用 django ORM 執行此操作而無需創建循環?

[編輯]- 例子

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

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

假設我只想保留每個 Modelb 的子集的 2 個最新結果,其余的應該如下

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

我會在模型中添加一個created字段,以便您知道 object 何時創建。 然后您可以對此進行排序以查找最新的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()

可能還值得注意的是 model 元數據的get_latest_by屬性,它允許您定義如何識別最新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM