[英]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.