diff --git a/validity/models/device.py b/validity/models/device.py index 498473f..1f07487 100644 --- a/validity/models/device.py +++ b/validity/models/device.py @@ -32,7 +32,10 @@ def _config_item(self) -> Serializable: data_file = self.data_source.datafiles.filter(path=config_path).first() return Serializable(self.serializer, data_file=data_file) except AttributeError as exc: - if exc.obj is not None: + # data_source may be None or, when the device is fetched without + # .prefetch_datasource()/.set_datasource(), missing altogether + missing_data_source = exc.obj is self and exc.name == "data_source" + if exc.obj is not None and not missing_data_source: raise return Serializable(self.serializer, data_file=None) diff --git a/validity/tests/test_models/test_vdevice.py b/validity/tests/test_models/test_vdevice.py index 5e641f9..d4bdfcb 100644 --- a/validity/tests/test_models/test_vdevice.py +++ b/validity/tests/test_models/test_vdevice.py @@ -80,6 +80,12 @@ def test_config_item(create_custom_fields): assert device._config_item() == Serializable(device.serializer, None) +def test_config_item_without_data_source(create_custom_fields): + device = DeviceFactory(name="d1") + device.serializer = SerializerDBFactory() + assert device._config_item() == Serializable(device.serializer, None) + + @pytest.mark.django_db def test_primary_ip(): vdevice = DeviceFactory()