我想從兩個具有dt
共同欄位的模型創建一個字典。這個欄位應該是字典鍵,欄位value
和last
鍵的值。最有效的方法是什么?
class Balance(models.Model):
value = models.FloatField(default=0)
dt = models.DateTimeField()
class Price(models.Model):
last = models.FloatField(default=0)
dt = models.DateTimeField()
所需的輸出將是這樣的:
{
"2022-10-11T00:00:00Z": {
"value": 151.05,
"last": 1,
},
"2022-10-10T00:00:00Z": {
"value": 151.1,
"last": 1.1,
},
"2022-10-09T00:00:00Z": {
"value": 152,
"last": 1.1,
},
"2022-10-08T00:00:00Z": {
"value": 154,
"last": 1.23,
}
}
我可以使用嵌套回圈遍歷查詢集的每個字典,并使用一個公共dt
然后在新字典中填充 key:value 搜索專案,但這并不優雅,我不相信它是有效的。
uj5u.com熱心網友回復:
這會做,但對效率不太確定。
import datetime
balance = Balance.objects.annotate(date_only=Cast('dt',DateField())).values("date_only", "value")
price = Price.objects.annotate(date_only=Cast('dt',DateField())).values("date_only", "last")
data = {}
for (a, b) in zip(balance, price):
str_date = a['date_only'].strftime("%Y/%m/%d")
if a['date_only'] == b['date_only']:
data[str_date] = {}
data[str_date]['last'] = b['last']
data[str_date]['value'] = a['value']
print(data)
uj5u.com熱心網友回復:
此版本應處理 OP 在評論中描述的額外不平衡價格行:
balances = (
Balance
.objects
.annotate(date_only=Cast('dt', DateField()))
.order_by("dt")
.values("date_only", "value")
)
balance_dates = {balance.dt for balance in balances}
prices = (
Price
.objects
.annotate(date_only=Cast('dt', DateField()))
.filter(dt__in=balance_dates)
.order_by("dt")
.values("date_only", "last")
)
data = {
balance['date_only'].strftime("%Y/%m/%d"): {
"last": price["last"],
"value": balance["value"],
}
for (balance, price) in zip(balances, prices)
}
Python 方面的效率與 Hemal Patel 的答案大致相同(這是基于)
但是資料庫查詢將受益于dt
列上的索引,如果表非常大,可能會很慢。
在這種情況下,您最好使用原始 SQL來輸出您想要的資料集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513626.html
標籤:Pythondjango