Python 仅通过.id查找django对象(未知模型)

Python 仅通过.id查找django对象(未知模型),python,django,Python,Django,我有两个独立的django(版本>=2.2)应用程序:校园和设备 校园 建筑 房间 装备 (对于公共属性,所有设备都使用基类设备) 摄像机 展示 切换器 来源 等等 有很多外键嵌套正在进行,例如源->切换器->房间->建筑,所有这些都可以正常工作。我能做像这样的事情 source\u list=source.objects.filter(switcher\u room\u id=room\u id)没有问题 我正在为将使用原始UDP字符串的设备创建一个API,所以我对它的花哨程度有点限制

我有两个独立的django(版本>=2.2)应用程序:校园和设备

校园

  • 建筑
  • 房间
装备 (对于公共属性,所有设备都使用基类设备)

  • 摄像机
  • 展示
  • 切换器
  • 来源
  • 等等
有很多外键嵌套正在进行,例如源->切换器->房间->建筑,所有这些都可以正常工作。我能做像这样的事情
source\u list=source.objects.filter(switcher\u room\u id=room\u id)
没有问题

我正在为将使用原始UDP字符串的设备创建一个API,所以我对它的花哨程度有点限制。我的问题是,我是否可以找出.id单独引用的是什么特定对象?我可以将查询范围缩小到设备应用程序,因为我可以根据主机IP地址计算建筑物/房间

换句话说,我的计划是从外部设备发送一个字符串,类似于
1356 | True | hdmi1 | whatever | 123 | abc | stuff
,其中1356是.id,然后在django中有效地找出1356所指的设备对象。我很擅长将字符串放入django视图的整个传输部分,我只需要确定1356是什么

这样做(伪代码)不是最好的方法:

试试看:
Display.objects.get(id=1356)
除:
不是显示器。。。
尝试:
Switcher.objects.get(id=1356)
除:
不是一个切换者。。。
尝试:
等等等等等等。
提前感谢您对可能是愚蠢问题的任何帮助。 洛根

更新 我希望,因为我的设备使用了一个公共基类,所以它们会有唯一的ID,但正如@arulmr警告我的那样,我毕竟能够让它们生成的ID发生冲突。我找到的解决方案确实增加了字符串的长度,但django创建唯一ID的方法如下:

导入uuid
类设备(models.Model):
id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
就这样。你现在有了一个16位的id,这在我们的有生之年是不会被复制的。当它发出UDP时,它的长度最终是36,如果这与我无关的话

解决了这个问题,我所要做的就是:

def fb_视图(请求,fb):
fb=fb.split(“|”)
id=fb.pop(0)#拔出id
尝试:
#.get()将显示,除非没有匹配项,
#所以我使用它作为if/elif来匹配id
Display.objects.get(id=id)
Display.objects.filter(id=id).update(
things=fb[0],
其他事物=int(fb[1]),
)
#没有用过,只是在那里发了一个200
返回HttpResponse(id,content\u type='text/plain')
除:
#match在另一台设备上
通过
尝试:
Switcher.objects.get(id=id)
Switcher.objects.filter(id=id).update(
things=fb[0],
其他事物=int(fb[1]),
)
返回HttpResponse(id,content\u type='text/plain')
除:
通过
#等等等等

谢谢你们两位!!毕竟,我最终得到了try/except链,但由于反馈处理对于每个模型都是唯一的,所以不管怎样,它都很好。另外,如果我想清理它,我可以将反馈处理.update()内容移动到单独的函数中。

这根本不是一个愚蠢的问题

您可能希望了解模型继承:

您可以设置一个抽象的设备基础模型,在其中输入id字段。然后,您的每个特定设备型号(摄像头、显示器、交换机等)都将继承此基础表


您可以使用此工具对基础模型进行骨骼化,以便从父对象上的搜索中获取子对象。

不同模型的ID中可能存在重复项。您可能能够根据所有可用的详细信息识别对象。但仅凭ID,它可以来自任何型号。谢谢@arulmr,我没意识到这一点!我还没有看透弗朗索瓦的答案,但当冲突成为现实时,你可能只是帮了我一把,让我在未来的道路上避免了一大堆困惑。很高兴它起到了作用!非常感谢。我已经用一个名为Device的模型完成了这项工作,该模型具有电源状态、ip地址等,但我没有意识到这会有所帮助。