[英]Find django object by .id only (unknown Model)
我有兩個單獨的 django (版本 >=2.2)應用程序:校園和設備。
校園
設備(都使用基類 Device 用於公共屬性)
有很多外鍵嵌套正在進行,例如。 源 -> 切換台 -> 房間 -> 建築,一切正常。 我可以source_list = Source.objects.filter(switcher__room_id=room_id)
地執行source_list = Source.objects.filter(switcher__room_id=room_id)
。
我正在為將使用原始 UDP 字符串的設備創建一個 API,所以我對它的花哨程度有點限制。 我的問題是,我能否以某種方式弄清楚 .id 單獨引用了哪個特定對象? 我可以將查詢范圍縮小到設備應用程序,因為我可以根據主機 IP 地址找出建築物/房間。
換句話說,我的計划是從外部設備發送一個類似於1356|True|hdmi1|whatever|123|abc|stuff|
的字符串1356|True|hdmi1|whatever|123|abc|stuff|
1356 是 .id,然后在 django 中有效地找出設備對象 1356 指的是什么。 我很擅長將字符串放入 Django 視圖的整個傳輸部分,我只需要確定 1356 是什么。
做這樣的事情(偽代碼)不是最好的方法:
try:
Display.objects.get(id=1356)
except:
not a display...
try:
Switcher.objects.get(id=1356)
except:
not a switcher...
try:
etc., etc., etc.
預先感謝您對可能是愚蠢的問題的任何幫助。 洛根
更新我希望因為我的設備使用了一個通用的基類,所以它們會有唯一的 ID,但我最終能夠讓它們生成的 ID 發生沖突,正如@arulmr 警告我的那樣。 我發現的解決方案肯定會為字符串增加一些長度,但是 django 創建唯一 id 的方法如下:
import uuid
class Device(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
就是這樣。 你現在有一個 16 位的 id,在我們的有生之年實際上不會被復制。 當它退出 UDP 時,它最終的長度為 36,如果這與除我之外的任何人相關。
解決了這個問題后,我所要做的就是:
def fb_view(request, fb):
fb = fb.split('|')
id = fb.pop(0) # pull out the id
try:
# .get() will except if there's no match,
# so I'm using that as my if/elif to match the id
Display.objects.get(id=id)
Display.objects.filter(id=id).update(
things=fb[0],
other_things=int(fb[1]),
)
# not used, just there to send a 200
return HttpResponse(id, content_type='text/plain')
except:
# match was on another device
pass
try:
Switcher.objects.get(id=id)
Switcher.objects.filter(id=id).update(
things=fb[0],
other_things=int(fb[1]),
)
return HttpResponse(id, content_type='text/plain')
except:
pass
# etc, etc
謝謝你們倆!! 畢竟我最終得到了 try/except 鏈,但是由於每個模型的反饋處理都是獨一無二的,所以無論如何都很好。 另外,如果我想清理它,我總是可以將反饋處理 .update() 內容移動到單獨的函數中。
這根本不是一個愚蠢的問題。
您可能想看看模型繼承: https : //docs.djangoproject.com/en/2.2/topics/db/models/#model-inheritance
您可以設置一個抽象的設備基礎模型,在其中放置您的 id 字段。 然后您的每個特定設備模型(攝像機、顯示器、切換台等)都從這個基表繼承。
您可以使用此技術對基礎模型進行綁定,以便從對其父對象的搜索中獲取子對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.