Django文档在如何过滤对象方面不是很清楚,因为它们包含相关字段的过滤子集。
假设我有以下型号:
class Device(models.Model):
name = models.CharField(max_length=50)
class DeviceEvent(models.model):
device=models.ForeignKey(Device, null=False, related_name='device_events')
handled = models.BooleanField(default=Fasle)
现在假设我要检索所有具有未处理的DeviceEvents的设备的列表。如何在Django中编写查询来执行此操作?
最终结果应该是设备是设备对象列表的设备,对于每个设备对象“设备”,我们有device.device_events是未处理的DeviceEvent对象的列表。这可以在Django中做到吗?
或者,我可以在python中这样做:
all_devices=Device.objects.all()
devices=[]
for thedevice in all_devices:
unhandled_device_events=thedevice.device_events.\
annotate(num_events=Count('device_events')).\
filter(device_event__device=thedevice).\
filter(num_events__gt=0).\
filter(device_event__handled=False).all()
if unhandled_device_events:
thedevice.device_events=unhandled_device_events
devices.append(thedevice)
在上面我创建了一个名为devices的新列表,然后循环遍历所有Device对象并仅在设备至少有一个未处理的事件时手动将设备添加到设备,并且该设备对象现在具有device.device_events =未处理设备事件(不是所有设备事件)。这是允许还是完全有效?
或者当我将其中一个device_events称为“device_event”而不是“deviceevent”时这是正确的?
答案 0 :(得分:0)
如果我理解你的问题,我认为这应该有效
Device.objects.get(Device.device_events.handled = False)
答案 1 :(得分:0)
由于它是ForeignKey关系,我相信你可以抓住所有键入设备的DeviceEvent(假设d
是Device类的一个实例):
d.deviceevent_set.all()
您应该能够像这样过滤:
d.deviceevent_set.filter(handled=False)
我没有对此进行测试,但我认为它会起作用。
编辑:在阅读你的评论后,我意识到我没有像我想象的那样仔细阅读你的问题。
拔出所需的设备后,您可以在for循环中使用上面的代码。获取您的设备实例,然后使用此代码段获取与该设备关联的未处理事件。例如,迭代device.objects.all()中的所有内容,并检查d.device_set.filter(processed = false)是否为每个设备返回任何内容。如果是这样,也许您可以将该设备作为键添加到字典中,将未处理事件列表添加为关联值。你最终会得到一个设备字典[unhandledevents]。如果你愿意的话,This post可以告诉你更多相关信息。
您是否能够以您需要的方式操纵数据,或者我是否根据您的需求进行操作?
答案 2 :(得分:0)
试试这个
d = Device.objects.filter(device_events__handled=False)