Django模型与相关字段的过滤子集

时间:2014-04-04 20:26:39

标签: python django django-models

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”时这是正确的?

3 个答案:

答案 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)