我有一些特殊的要求,我試圖找出編碼它的最佳方法。 最好的效率最高,可維護性排在第二位。需求是這樣的(與我一起):Django網絡應用程序的棘手的編碼邏輯
我在我的Django網站上有一個功能,這意味着服務登記和未登記的用戶。這個功能將會在每個用戶的PIN碼之後被選通。我需要這些引腳是隨機生成的(而不是連續的)。
該PIN碼將需要難忘 - 這意味着引腳len
成爲一個因素。因此,我要爲4位數字引腳。只有數字,因爲字母數字比純數字難以記憶(根據我進行的可用性測試 - 我堅持這些結果)。
我不能在引腳代碼之間發生衝突,因爲它們也會被用作標識符 - 所以它們都必須是唯一的。我的範圍將介於0000到9999之間。只有10K個獨特的組合是可能的。這是限制性的,但是引腳代碼的可記錄性優先於可能的引腳代碼池的大小。所以我會犧牲。
最後,註冊用戶的密碼將被永久分配。另一方面,未註冊的用戶將被分配的引腳保持不超過24小時,之後他們到期 - 因此再次進入未使用的引腳池。
想象一下,上面我的數據模型(models.py
)是像這樣:
class Inbox(models.Model):
pin_code = models.CharField(default='0')
owner = models.ForeignKey(User)
creation_time = models.DateTimeField(auto_now_add=True)
在views.py
,我需要一種方法來分配可用的pin_code
每個Inbox
對象創建。什麼是最有效的邏輯?以下是我想我可以接近它:
def expire_pin(time_difference=None):
#admin user (with id 1) is assumed as the 'unregistered user'
Inbox.objects.filter(creation_time__lte=time_difference,owner_id=1).update(pin_code='0')
def get_pin():
parent_list = ['{:04d}'.format(i) for i in range(10000)]
day_ago = timezone.now() - timedelta(hours=24)
expire_pin(day_ago)
to_exclude = Inbox.objects.filter(~Q(pin_code='0')).values_list('pin_code',flat=True)
new_list = [item for item in parent_list if item not in to_exclude]
return random.choice(new_list)
可選:你沒有讀它,但這裏是我使用pin_code
什麼。每個用戶(已註冊和未註冊)都分配了一個可在example.com/pin/XXXX
(XXXX
即pin_code
)上訪問的收件箱。用戶可以通過社交媒體與他們的朋友分享這個收件箱地址。然後,朋友可以通過他們的手機號碼登錄到該用戶,查看前用戶留下的內容,特別是對於該朋友的眼睛。趕上漂移?
我需要此功能用於註冊和未註冊的用戶 - 因此需要分配pin_code
甚至不知道的用戶。但我希望能夠回收未註冊的用戶代碼,以便我不會太快地用完10K的可能性。我在這個網站上有一個適度的大用戶羣。
最終雖然,我將耗盡10K組合。我想我會寫代碼,然後無縫地切換到5位數的引腳。但即使在這種情況下,如果任何4位數的引腳過期並變得可用,它們在分配期間將優先考慮。如果你也可以幫助我完成這部分,那太棒了!
關於記憶:是的,它是一個必要條件。事情是,我也使用URL模式生成的引腳 - 從而避免衝突,他們必須是唯一的。但如果您暗示我允許用戶決定保留什麼,無論長短如何 - 我的用戶已經擁有'暱稱'我可以使用。但是很多人都是罕見的角色,有些角色是非常長的。如果你是複製粘貼,這將是很好,但我實際上有一個相當大的人口統計使用**功能手機**,實際上必須手動輸入網址來分享它們*(在我的可選部分閱讀更多內容題)*。 –