From 4038b130196c3437e73e1415fc644e62ee70a414 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 30 Jul 2025 11:34:56 -0400 Subject: [PATCH] Set blank=True on denormalized ForeignKeys --- ...9_device_component_denorm_site_location.py | 100 ++++++++++++------ netbox/dcim/models/device_components.py | 3 + 2 files changed, 73 insertions(+), 30 deletions(-) diff --git a/netbox/dcim/migrations/0209_device_component_denorm_site_location.py b/netbox/dcim/migrations/0209_device_component_denorm_site_location.py index 962dc1464..e3b5d0f37 100644 --- a/netbox/dcim/migrations/0209_device_component_denorm_site_location.py +++ b/netbox/dcim/migrations/0209_device_component_denorm_site_location.py @@ -37,210 +37,250 @@ class Migration(migrations.Migration): model_name='consoleport', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='consoleport', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='consoleport', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='consoleserverport', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='consoleserverport', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='consoleserverport', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='devicebay', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='devicebay', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='devicebay', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='frontport', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='frontport', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='frontport', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='interface', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='interface', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='interface', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='inventoryitem', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='inventoryitem', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='inventoryitem', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='modulebay', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='modulebay', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='modulebay', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='poweroutlet', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='poweroutlet', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='poweroutlet', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='powerport', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='powerport', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='powerport', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.AddField( model_name='rearport', name='_location', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.location' + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.location', ), ), migrations.AddField( model_name='rearport', name='_rack', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.rack' ), ), migrations.AddField( model_name='rearport', name='_site', field=models.ForeignKey( - null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.site' ), ), migrations.RunPython(populate_denormalized_data), diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 60a5d7395..87680dd98 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -70,18 +70,21 @@ class ComponentModel(NetBoxModel): to='dcim.Site', on_delete=models.SET_NULL, related_name='+', + blank=True, null=True, ) _location = models.ForeignKey( to='dcim.Location', on_delete=models.SET_NULL, related_name='+', + blank=True, null=True, ) _rack = models.ForeignKey( to='dcim.Rack', on_delete=models.SET_NULL, related_name='+', + blank=True, null=True, )