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



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

校园

  • 建筑
  • 房间

设备(所有使用基本类设备的通用属性(

  • 相机
  • 显示器
  • 切换器
  • 来源
  • 等等

有很多外键嵌套正在进行,例如source->切换器->房间->建筑,所有这些都很好。我可以做一些事情source_list = Source.objects.filter(switcher__room_id=room_id)没有问题。

我正在为将使用原始UDP字符串的设备创建一个API,所以我对它的新奇程度有点限制。我的问题是,我能以某种方式弄清楚哪一个特定对象被.id单独引用吗我可以将查询范围缩小到设备应用程序,因为我可以根据主机IP地址计算出建筑物/房间。

换句话说,我的计划是从外部设备发送一个字符串,类似于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.

提前感谢您在这个可能很愚蠢的问题上提供的任何帮助。Logan

UPDATE我希望由于我的设备使用了一个公共基类,它们会有唯一的ID,但正如@aurlmr警告我的那样,我最终能够让它们生成的ID发生冲突。我找到的解决方案肯定会给字符串增加一些长度,但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链,但由于反馈处理对每个模型都是唯一的,所以无论如何都很好。另外,如果我想清理的话,我总是可以把feedbackhandle.update((的东西移到单独的函数中。

这不是一个愚蠢的问题。

您可能需要了解模型继承:https://docs.djangoproject.com/en/2.2/topics/db/models/#model-继承

您可以设置一个抽象的设备基础模型,在其中放置您的id字段。然后,您的每一个特定设备型号(相机、显示器、切换器等(都会从这个基表中继承。

你可以用这个技术来完善你的基本模型,以便从搜索其父对象中获得子对象。

最新更新