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