所以我有這個Post模型。我希望能夠檢索created某個時區下一個月、一年的所有帖子。
我的目標是實作一項功能,讓世界上任何地方的用戶都可以在 PST 中獲取其他人在其時區某個月份發布的所有帖子。因此,假設用戶 A 在 EST 中,而用戶 B 在 PST 中(比 EST 晚 3 小時)。用戶 B 希望查看用戶 A 在 2021 年 10 月創建的所有帖子。由于該應用將在用戶當前所在的時區顯示帖子(我們以 UTC 發送日期時間,然后前端轉換為本地時間)然后應用程式應僅將用戶 A 在太平洋標準時間 2021 年 10 月創建的所有帖子發送給用戶 B。因此,例如,如果用戶 A(美國東部標準時間的用戶)在美國東部標準時間 2021 年 10 月 31 日晚上 11 點(太平洋標準時間 2021 年 10 月 31 日晚上 8 點)和美國東部標準時間 2021 年 11 月 1 日凌晨 1 點(太平洋標準時間 2021 年 10 月 31 日晚上 10 點)發帖,那么用戶 B 應該得到兩個帖子都回復了,因為第二個帖子是在美國東部時間 11 月制作的,但在太平洋標準時間 10 月制作。
model.py
class Post(models.Model):
uuid = models.UUIDField(primary_key=True)
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
body = models.CharField(max_length=POST_MAX_LEN)
例如,如果用戶在 PST 中在 11 月創建了 10 個帖子,在 2021 年 12 月創建了 2 個帖子。然后,我有一個觀點,即需要month,year并time_zone讓我們說的URL看起來像/post/<int:month>/<int:year>/<str:time_zone>和用戶坪/post/11/2021/PST那么就應該從十一月回傳10個職位。如何回傳給定時區、月份和年份的時區中月份和年份的所有帖子?
注意:要考慮的棘手的極端情況是他們是否在一個月的最后一天發帖很晚。根據時區,UTC 中的 12/31/2021 可能是 01/01/2022。因為 Djangodatetime以 UTC格式存盤欄位,所以需要做的事情被轉換created為給定的,time_zone然后從指定的month和year.
設定:
- Django 3.2.9
- PostgreSQL
嘗試的解決方案
- 對我來說最明顯的解決方案是轉換
created為指定time_zone然后做Post.objects.filter(created__in_range=<some range>)
uj5u.com熱心網友回復:
我會嘗試這樣的事情:
假設您通過給定的月份作為given_month傳遞給 定的年份作為given_year 和給定的時區作為given_timezone
Model_Name.objects.filter(created.split('/',4)[2]=given_month,created.split('/',4)[3]=given_year, created.split('/',4)[4]=given_timezone)
這應該從您帖子的月份和年份以及時區部分獲取值。你可能需要玩弄我給你的東西。此外,最好添加用戶與帖子的關系,以便您可以使用我給定的答案過濾用戶的帖子。在大多數情況下,假設帖子比用戶多,這將更有效率。這應該讓你走上正確的軌道。
uj5u.com熱心網友回復:
取當月的第一時刻(1 號午夜)和下個月的第一時刻 UTC,用你想要的時區調整它們,做一個posted__range=(a, b) 查詢?
這可能有效(但日期數學很繁瑣......)。
這需要python-dateutil使計算end時間健壯。
from dateutil.relativedelta import relativedelta
from django.utils import timezone
year = 2021
month = 6
tz = datetime.tzinfo("PST")
start = datetime.datetime(year, month, 1)
end = start relativedelta(months=1)
posts = Post.objects.filter(created__range=(
timezone.make_aware(start, tz),
timezone.make_aware(end, tz),
))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389599.html
上一篇:帶有兩個模型的ListView中的Djangoobject_list
下一篇:Django將人多元化為人
