繁体   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