Merge pull request #19070 from netbox-community/17166-remove-limit_choices_to

Closes #17166: Remove obsolete `limit_choices_to` argument from ForeignKey & M2M fields
This commit is contained in:
bctiemann 2025-04-07 14:10:05 -04:00 committed by GitHub
commit 3902cab925
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
30 changed files with 2 additions and 224 deletions

View File

@ -39,9 +39,6 @@ class Migration(migrations.Migration):
name='termination_type', name='termination_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
('model__in', ('region', 'sitegroup', 'site', 'location', 'providernetwork'))
),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -51,7 +51,6 @@ class Migration(migrations.Migration):
name='member_type', name='member_type',
field=models.ForeignKey( field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
limit_choices_to=models.Q(('app_label', 'circuits'), ('model__in', ['circuit', 'virtualcircuit'])),
related_name='+', related_name='+',
to='contenttypes.contenttype', to='contenttypes.contenttype',
blank=True, blank=True,
@ -68,7 +67,6 @@ class Migration(migrations.Migration):
model_name='circuitgroupassignment', model_name='circuitgroupassignment',
name='member_type', name='member_type',
field=models.ForeignKey( field=models.ForeignKey(
limit_choices_to=models.Q(('app_label', 'circuits'), ('model__in', ['circuit', 'virtualcircuit'])),
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='contenttypes.contenttype' to='contenttypes.contenttype'

View File

@ -182,7 +182,6 @@ class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin,
""" """
member_type = models.ForeignKey( member_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+' related_name='+'
) )
@ -249,7 +248,6 @@ class CircuitTermination(
termination_type = models.ForeignKey( termination_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
on_delete=models.PROTECT, on_delete=models.PROTECT,
limit_choices_to=Q(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES),
related_name='+', related_name='+',
blank=True, blank=True,
null=True null=True

View File

@ -505,28 +505,6 @@ class Migration(migrations.Migration):
model_name='cable', model_name='cable',
name='termination_a_type', name='termination_a_type',
field=models.ForeignKey( field=models.ForeignKey(
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'circuits'), ('model__in', ('circuittermination',))),
models.Q(
('app_label', 'dcim'),
(
'model__in',
(
'consoleport',
'consoleserverport',
'frontport',
'interface',
'powerfeed',
'poweroutlet',
'powerport',
'rearport',
),
),
),
_connector='OR',
)
),
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='contenttypes.contenttype', to='contenttypes.contenttype',
@ -536,28 +514,6 @@ class Migration(migrations.Migration):
model_name='cable', model_name='cable',
name='termination_b_type', name='termination_b_type',
field=models.ForeignKey( field=models.ForeignKey(
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'circuits'), ('model__in', ('circuittermination',))),
models.Q(
('app_label', 'dcim'),
(
'model__in',
(
'consoleport',
'consoleserverport',
'frontport',
'interface',
'powerfeed',
'poweroutlet',
'powerport',
'rearport',
),
),
),
_connector='OR',
)
),
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='contenttypes.contenttype', to='contenttypes.contenttype',

View File

@ -866,21 +866,6 @@ class Migration(migrations.Migration):
name='component_type', name='component_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
('app_label', 'dcim'),
(
'model__in',
(
'consoleport',
'consoleserverport',
'frontport',
'interface',
'poweroutlet',
'powerport',
'rearport',
),
),
),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
@ -1238,21 +1223,6 @@ class Migration(migrations.Migration):
'component_type', 'component_type',
models.ForeignKey( models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
('app_label', 'dcim'),
(
'model__in',
(
'consoleporttemplate',
'consoleserverporttemplate',
'frontporttemplate',
'interfacetemplate',
'poweroutlettemplate',
'powerporttemplate',
'rearporttemplate',
),
),
),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
@ -1478,28 +1448,6 @@ class Migration(migrations.Migration):
( (
'termination_type', 'termination_type',
models.ForeignKey( models.ForeignKey(
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'circuits'), ('model__in', ('circuittermination',))),
models.Q(
('app_label', 'dcim'),
(
'model__in',
(
'consoleport',
'consoleserverport',
'frontport',
'interface',
'powerfeed',
'poweroutlet',
'powerport',
'rearport',
),
),
),
_connector='OR',
)
),
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='contenttypes.contenttype', to='contenttypes.contenttype',

View File

@ -31,13 +31,6 @@ class Migration(migrations.Migration):
'assigned_object_type', 'assigned_object_type',
models.ForeignKey( models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'dcim'), ('model', 'interface')),
models.Q(('app_label', 'virtualization'), ('model', 'vminterface')),
_connector='OR',
)
),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -259,7 +259,6 @@ class CableTermination(ChangeLoggedModel):
) )
termination_type = models.ForeignKey( termination_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=CABLE_TERMINATION_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+' related_name='+'
) )

View File

@ -751,7 +751,6 @@ class InventoryItemTemplate(MPTTModel, ComponentTemplateModel):
) )
component_type = models.ForeignKey( component_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=MODULAR_COMPONENT_TEMPLATE_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+', related_name='+',
blank=True, blank=True,

View File

@ -1274,7 +1274,6 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin):
) )
component_type = models.ForeignKey( component_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=MODULAR_COMPONENT_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+', related_name='+',
blank=True, blank=True,

View File

@ -1225,7 +1225,6 @@ class MACAddress(PrimaryModel):
) )
assigned_object_type = models.ForeignKey( assigned_object_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=MACADDRESS_ASSIGNMENT_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+', related_name='+',
blank=True, blank=True,

View File

@ -3,7 +3,6 @@ from django.contrib.contenttypes.fields import GenericForeignKey
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from dcim.constants import LOCATION_SCOPE_TYPES
__all__ = ( __all__ = (
'CachedScopeMixin', 'CachedScopeMixin',
@ -44,7 +43,6 @@ class CachedScopeMixin(models.Model):
scope_type = models.ForeignKey( scope_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
on_delete=models.PROTECT, on_delete=models.PROTECT,
limit_choices_to=models.Q(model__in=LOCATION_SCOPE_TYPES),
related_name='+', related_name='+',
blank=True, blank=True,
null=True null=True

View File

@ -195,12 +195,6 @@ class Migration(migrations.Migration):
'scope_type', 'scope_type',
models.ForeignKey( models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
(
'model__in',
('region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster'),
)
),
null=True, null=True,
on_delete=django.db.models.deletion.CASCADE, on_delete=django.db.models.deletion.CASCADE,
to='contenttypes.contenttype', to='contenttypes.contenttype',

View File

@ -154,13 +154,6 @@ class Migration(migrations.Migration):
name='assigned_object_type', name='assigned_object_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'dcim'), ('model', 'interface')),
models.Q(('app_label', 'virtualization'), ('model', 'vminterface')),
_connector='OR',
)
),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -136,14 +136,6 @@ class Migration(migrations.Migration):
name='assigned_object_type', name='assigned_object_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'dcim'), ('model', 'interface')),
models.Q(('app_label', 'ipam'), ('model', 'fhrpgroup')),
models.Q(('app_label', 'virtualization'), ('model', 'vminterface')),
_connector='OR',
)
),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -304,14 +304,6 @@ class Migration(migrations.Migration):
( (
'assigned_object_type', 'assigned_object_type',
models.ForeignKey( models.ForeignKey(
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'dcim'), ('model', 'interface')),
models.Q(('app_label', 'ipam'), ('model', 'vlan')),
models.Q(('app_label', 'virtualization'), ('model', 'vminterface')),
_connector='OR',
)
),
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='contenttypes.contenttype', to='contenttypes.contenttype',

View File

@ -33,7 +33,6 @@ class Migration(migrations.Migration):
name='scope_type', name='scope_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(('model__in', ('region', 'sitegroup', 'site', 'location'))),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -742,7 +742,6 @@ class IPAddress(ContactsMixin, PrimaryModel):
) )
assigned_object_type = models.ForeignKey( assigned_object_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=IPADDRESS_ASSIGNMENT_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+', related_name='+',
blank=True, blank=True,

View File

@ -45,7 +45,6 @@ class VLANGroup(OrganizationalModel):
scope_type = models.ForeignKey( scope_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
on_delete=models.CASCADE, on_delete=models.CASCADE,
limit_choices_to=Q(model__in=VLANGROUP_SCOPE_TYPES),
blank=True, blank=True,
null=True null=True
) )

View File

@ -132,20 +132,6 @@ class Migration(migrations.Migration):
( (
'object_types', 'object_types',
models.ManyToManyField( models.ManyToManyField(
limit_choices_to=models.Q(
models.Q(
models.Q(
(
'app_label__in',
['account', 'admin', 'auth', 'contenttypes', 'sessions', 'taggit', 'users'],
),
_negated=True,
),
models.Q(('app_label', 'auth'), ('model__in', ['group', 'user'])),
models.Q(('app_label', 'users'), ('model__in', ['objectpermission', 'token'])),
_connector='OR',
)
),
related_name='object_permissions', related_name='object_permissions',
to='contenttypes.ContentType', to='contenttypes.ContentType',
), ),

View File

@ -13,23 +13,6 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='objectpermission', model_name='objectpermission',
name='object_types', name='object_types',
field=models.ManyToManyField( field=models.ManyToManyField(related_name='object_permissions', to='core.objecttype'),
limit_choices_to=models.Q(
models.Q(
models.Q(
(
'app_label__in',
['account', 'admin', 'auth', 'contenttypes', 'sessions', 'taggit', 'users'],
),
_negated=True,
),
models.Q(('app_label', 'auth'), ('model__in', ['group', 'user'])),
models.Q(('app_label', 'users'), ('model__in', ['objectpermission', 'token'])),
_connector='OR',
)
),
related_name='object_permissions',
to='core.objecttype',
),
), ),
] ]

View File

@ -28,22 +28,6 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='objectpermission', model_name='objectpermission',
name='object_types', name='object_types',
field=models.ManyToManyField( field=models.ManyToManyField(related_name='object_permissions', to='core.objecttype'),
limit_choices_to=models.Q(
models.Q(
models.Q(
(
'app_label__in',
['account', 'admin', 'auth', 'contenttypes', 'sessions', 'taggit', 'users'],
),
_negated=True,
),
models.Q(('app_label', 'users'), ('model__in', ['objectpermission', 'token', 'group', 'user'])),
_connector='OR',
)
),
related_name='object_permissions',
to='core.objecttype',
),
), ),
] ]

View File

@ -3,7 +3,6 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from users.constants import OBJECTPERMISSION_OBJECT_TYPES
from utilities.querysets import RestrictedQuerySet from utilities.querysets import RestrictedQuerySet
__all__ = ( __all__ = (
@ -31,7 +30,6 @@ class ObjectPermission(models.Model):
) )
object_types = models.ManyToManyField( object_types = models.ManyToManyField(
to='core.ObjectType', to='core.ObjectType',
limit_choices_to=OBJECTPERMISSION_OBJECT_TYPES,
related_name='object_permissions' related_name='object_permissions'
) )
actions = ArrayField( actions = ArrayField(

View File

@ -154,7 +154,6 @@ class Migration(migrations.Migration):
'role', 'role',
models.ForeignKey( models.ForeignKey(
blank=True, blank=True,
limit_choices_to={'vm_role': True},
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='virtual_machines', related_name='virtual_machines',

View File

@ -32,7 +32,6 @@ class Migration(migrations.Migration):
name='scope_type', name='scope_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(('model__in', ('region', 'sitegroup', 'site', 'location'))),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -82,7 +82,6 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co
to='dcim.DeviceRole', to='dcim.DeviceRole',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='virtual_machines', related_name='virtual_machines',
limit_choices_to={'vm_role': True},
blank=True, blank=True,
null=True null=True
) )

View File

@ -72,14 +72,6 @@ class Migration(migrations.Migration):
( (
'assigned_object_type', 'assigned_object_type',
models.ForeignKey( models.ForeignKey(
limit_choices_to=models.Q(
models.Q(
models.Q(('app_label', 'dcim'), ('model', 'interface')),
models.Q(('app_label', 'ipam'), ('model', 'vlan')),
models.Q(('app_label', 'virtualization'), ('model', 'vminterface')),
_connector='OR',
)
),
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='contenttypes.contenttype', to='contenttypes.contenttype',

View File

@ -8,7 +8,6 @@ from core.models import ObjectType
from netbox.models import NetBoxModel, PrimaryModel from netbox.models import NetBoxModel, PrimaryModel
from netbox.models.features import ContactsMixin from netbox.models.features import ContactsMixin
from vpn.choices import L2VPNStatusChoices, L2VPNTypeChoices from vpn.choices import L2VPNStatusChoices, L2VPNTypeChoices
from vpn.constants import L2VPN_ASSIGNMENT_MODELS
__all__ = ( __all__ = (
'L2VPN', 'L2VPN',
@ -93,7 +92,6 @@ class L2VPNTermination(NetBoxModel):
) )
assigned_object_type = models.ForeignKey( assigned_object_type = models.ForeignKey(
to='contenttypes.ContentType', to='contenttypes.ContentType',
limit_choices_to=L2VPN_ASSIGNMENT_MODELS,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+' related_name='+'
) )

View File

@ -4,7 +4,6 @@ import taggit.managers
from django.db import migrations, models from django.db import migrations, models
import utilities.json import utilities.json
import wireless.models
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -149,7 +148,6 @@ class Migration(migrations.Migration):
( (
'interface_a', 'interface_a',
models.ForeignKey( models.ForeignKey(
limit_choices_to=wireless.models.get_wireless_interface_types,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='dcim.interface', to='dcim.interface',
@ -158,7 +156,6 @@ class Migration(migrations.Migration):
( (
'interface_b', 'interface_b',
models.ForeignKey( models.ForeignKey(
limit_choices_to=wireless.models.get_wireless_interface_types,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',
to='dcim.interface', to='dcim.interface',

View File

@ -66,7 +66,6 @@ class Migration(migrations.Migration):
name='scope_type', name='scope_type',
field=models.ForeignKey( field=models.ForeignKey(
blank=True, blank=True,
limit_choices_to=models.Q(('model__in', ('region', 'sitegroup', 'site', 'location'))),
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name='+', related_name='+',

View File

@ -123,26 +123,18 @@ class WirelessLAN(WirelessAuthenticationBase, CachedScopeMixin, PrimaryModel):
return WirelessLANStatusChoices.colors.get(self.status) return WirelessLANStatusChoices.colors.get(self.status)
def get_wireless_interface_types():
# Wrap choices in a callable to avoid generating dummy migrations
# when the choices are updated.
return {'type__in': WIRELESS_IFACE_TYPES}
class WirelessLink(WirelessAuthenticationBase, DistanceMixin, PrimaryModel): class WirelessLink(WirelessAuthenticationBase, DistanceMixin, PrimaryModel):
""" """
A point-to-point connection between two wireless Interfaces. A point-to-point connection between two wireless Interfaces.
""" """
interface_a = models.ForeignKey( interface_a = models.ForeignKey(
to='dcim.Interface', to='dcim.Interface',
limit_choices_to=get_wireless_interface_types,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+', related_name='+',
verbose_name=_('interface A'), verbose_name=_('interface A'),
) )
interface_b = models.ForeignKey( interface_b = models.ForeignKey(
to='dcim.Interface', to='dcim.Interface',
limit_choices_to=get_wireless_interface_types,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+', related_name='+',
verbose_name=_('interface B'), verbose_name=_('interface B'),