Просмотр исходного кода

Fixes #23425: Widen TaggedItem.object_id to a 64-bit integer (#23429)

TaggedItem inherited a 32-bit object_id from django-taggit's
GenericTaggedItemBase, so tagging an object whose ID exceeds 2,147,483,647
failed with "integer out of range". Override the field as a
PositiveBigIntegerField, matching NetBox's other object-reference columns.
Jeremy Stretch 5 часов назад
Родитель
Сommit
4aeb69bd7a

+ 16 - 0
netbox/extras/migrations/0145_taggeditem_object_id_bigint.py

@@ -0,0 +1,16 @@
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('extras', '0144_customfield_status'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='taggeditem',
+            name='object_id',
+            field=models.PositiveBigIntegerField(db_index=True),
+        ),
+    ]

+ 5 - 0
netbox/extras/models/tags.py

@@ -79,6 +79,11 @@ class TaggedItem(GenericTaggedItemBase):
         related_name="%(app_label)s_%(class)s_items",
         on_delete=models.CASCADE
     )
+    # Overrides django-taggit's 32-bit IntegerField to accommodate 64-bit object IDs
+    object_id = models.PositiveBigIntegerField(
+        verbose_name=_('object ID'),
+        db_index=True
+    )
 
     _netbox_private = True
     objects = RestrictedQuerySet.as_manager()

+ 12 - 0
netbox/extras/tests/test_models.py

@@ -504,6 +504,18 @@ class TagTestCase(TestCase):
         with self.assertRaises(AbortRequest):
             sitegroup.tags.add(tag)
 
+    def test_tag_object_with_64bit_id(self):
+        """
+        Objects whose IDs exceed the 32-bit range can be tagged. Regression test for #23425.
+        """
+        site = Site.objects.create(id=3_000_000_000, name='Site 1', slug='site-1')
+        tag = Tag.objects.create(name='Tag 1', slug='tag-1')
+
+        site.tags.add(tag)
+
+        self.assertEqual(list(Site.objects.get(pk=site.pk).tags.all()), [tag])
+        self.assertEqual(list(Site.objects.filter(tags=tag)), [site])
+
 
 class ConfigContextTestCase(TestCase):
     """