寻找活跃的 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 方法需要聚合函数(例如 SumCount 等)而不是 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')
)