Нельзя смешивать экземпляры из разных моделей в одном наборе запросов (причины кажутся достаточно очевидными, если вспомнить, что модели и наборы запросов - это просто тонкие слои в реляционной базе данных).
Теперь ничто не мешает вам предоставить собственную итерацию. В самом простом случае вы просто соединяете вместе оба набора запросов в генераторе ie:
import itertools
def iter_subs(self):
yield from itertools.chain(self.machinealertzone_set.all(), self.activityrecording_set.all())
или что-то более сложное (сортировка «подчиненных» объектов по некоторым критериям и т. Д. c) в зависимости от ваших потребностей.
При этом я не вижу смысла ... Учитывая ваши определения моделей (мало общих полей и нет общих операций), это будет очень разнородная коллекция, и вам, вероятно, придется проверять каждый элемент по типу во время итерации, чтобы знать, что с ней делать, что побеждает весь смысл их извлечения сразу.
РЕДАКТИРОВАТЬ
Мне нужно получить все они сразу, потому что когда для одного активного поля объекта AlertTypeMaster установлено значение True, для всех активных полей подобъекта также должно быть установлено значение True. Если мой подход неэффективен, не могли бы вы предложить лучший способ?
Это денормализация. Тебе это действительно нужно? Если MachineAlertZone и ActivityRecording status
должны отражать их AlertTypeMaster, то правильный дизайн (теоретически, согласно нормальным формам реляционной модели) состоит в том, чтобы просто получить статус непосредственно из AlertTypeMaster:
class StatusQueryset(models.Queryset):
# allow to filter MachineAlertZone and ActivityRecording
# by their parent AlertType active status
def active(self):
return self.filter(alert_type__active=True)
class MachineAlertZone():
machine = models.ForeignKey(MachineMaster, on_delete=models.CASCADE)
on_delete=models.CASCADE)
alert_type = models.ForeignKey(AlertTypeMaster, on_delete=models.CASCADE)
radius_value = models.CharField(max_length=50)
#active = models.BooleanField(default=True)
@property
def active(self):
return self.alert_type.status
objects = StatusQueryset.as_manager()
Но если вы все еще хотите сохранить отдельный флаг для ваших «подмоделей», вам все равно не нужно «извлекать их все сразу», чтобы обновить их статус - просто выполните два запроса на обновление в транзакции в вашем AlertTypeMaster.save()
методе:
from django.db import transaction
class AlertTypeMaster(models.Model):
def save(self, *args, **kw):
with transaction.atomic():
super(AlertTypeMaster, self).save(*args, **kw)
self.machinealertzone_set.update(active=self.active)
self.activityrecording_set.update(active=self.active)