寻找活跃的 ForeignKey 并添加到 QuerySet
Looking for ForeignKey active and add to QuerySet
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 中获取查询集时,我想获取 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'
我只想 prefetch_related 带过滤器,但在新列中使用模型方法中的 _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')
)
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 中获取查询集时,我想获取 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'
我只想 prefetch_related 带过滤器,但在新列中使用模型方法中的 _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')
)