我有以下型號:
class CloudObjects(models.Model):
object_id = models.AutoField(primary_key=True)
object_name = models.CharField(max_length=256)
creation_time = models.DateTimeField()
removed_date = models.DateTimeField(blank=True, null=True)
item = models.ManyToManyField(BackupItems, db_table='cloud_object_items')
class BackupItems(models.Model):
name = models.CharField(max_length=100)
我想為每個 BackupItem 注釋,CloudObject 中最近的 creation_time 欄位,用于計劃將來在 removed_date 中洗掉的專案。例如:CloudObject 看起來像這樣。
object_id | object_name | creation_time | removed_date | item
1 | object_one_in_cloud | 2021-01-01 | 2021-10-01 | 1
2 | object_two_in_cloud | 2021-02-02 | 2099-12-31 | 1
3 | object_three_in_cloud | 2021-03-03 | 2099-12-31 | 1
4 | object_four_in_cloud | 2021-12-31 | 2022-01-01 | 1
對于上面的示例,我想用 item 3進行注釋,因為它在未來已經洗掉了_date,這是最新鮮的專案(專案 2 也計劃在未來被洗掉,但 3 是更新的)
現在在我的觀點中,我想對此進行注釋。我嘗試了不同的方法,但現在可以繼續前進。這是我嘗試的最后一個:
from django.db.models import Subquery, OuterRef
class BackupListView(ListView):
template_name = 'somefile.html'
def get_queryset(self):
last_item = CloudObjects.objects.filter(item=OuterRef("pk")).filter(removed_date__gte=timezone.now()).last()
all_items = BackupItems.objects.annotate(last_backup=Subquery(last_item.get('creation_time')))
return all_items
如何讓它作業?
uj5u.com熱心網友回復:
如中所述docs:
(使用 get() 代替切片會失敗,因為在子查詢中使用查詢集之前無法決議 OuterRef。)
lastget其行為與嘗試決議查詢集的位置類似,但OuterRef需要首先位于子查詢中。這就是為什么它不起作用。所以應該像這樣使用切片:
def get_queryset(self):
cloud_objects = CloudObjects.objects.filter(
item=OuterRef("pk")
).filter(
removed_date__gte=timezone.now()
).order_by(
"-creation_time"
)
all_items = BackupItems.objects.annotate(
last_backup_date=Subquery(
cloud_objects.values("creation_time")[:1]
)
)
return all_items
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/409948.html
標籤:
