class Control(models.Model):
period = models.DurationField()
active = models.BooleanField()
device_collection = models.ForeignKey(DeviceSet)
class DeviceSet(models.Model):
name = models.CharField()
date_last_control = models.DateField()
def get_next_control(self):
return self.date_last_control + self.control_actif.period
@property
def control_actif(self):
if not hasattr(self, "_control"):
setattr(self, "_control", self.control_set.get(active=True))
return self._control
有几个控件与DeviceSet关联,但只有一个控件由DeviceSet激活。当我在列_Control中获得queryset时,我想获得DeviceSet的活动控件。我已经试过了:
DeviceSet.objects.annotate(_control = Q(control__active=True))
这不起作用
'WhereNode' object has no attribute 'output_field'
在设置output_field=Control之后,我有以下异常:
type object 'Control' has no attribute 'resolve_expression'
我只想在一个新的列中使用模型方法中的_control属性。
由于annotate
方法需要一个聚合函数(例如Sum
、Count
等(而不是Q
对象,因此您尝试的操作会出错。
由于Django 1.7可以使用prefetch_related
执行您想要的操作,请参阅此处的文档:https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.Prefetch
DeviceSet.objects.prefetch_related(
Prefetch('control_set',
queryset=Control.objects.filter(active=True),
to_attr='_control')
)