簡體   English   中英

僅通過 .id 查找 django 對象(未知模型)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM