RecursionError when trying to call serialize_object() for a model which has m2m to DeviceType #8615

Closed
opened 2025-12-29 20:38:55 +01:00 by adam · 0 comments
Owner

Originally created by @amyasnikov on GitHub (Sep 14, 2023).

NetBox version

v3.6.1

Python version

3.10

Steps to Reproduce

  1. Create a sample plugin. models.py will be enough, all other web-related stuff is not required
# models.py

from django.db import models
from netbox.models import NetBoxModel
from dcim.models import DeviceType


class SomeModel(NetBoxModel):
    device_types = models.ManyToManyField(DeviceType, related_name="+")
  1. Create DeviceType object. All the properties doesn't matter
  2. Create SomeModel object, bind device type from step 2 to it.
  3. Try to call serialize_object for the object created at step 3
from dcim.models import DeviceType
from testplugin.models import SomeModel
from utilities.utils import serialize_object

device_type = DeviceType.objects.all()[0]

my_model = SomeModel.objects.create()
my_model.device_types.set([device_type])

serialize_object(my_model)  # RecursionError: maximum recursion depth exceeded

Expected Behavior

serialize_object(my_model) doesn't lead to StackOverflow RecursionError

Observed Behavior

RecursionError was raised.
As you know serialize_object() is called during form.save(). So this issue isn't just "theoretical"

Originally created by @amyasnikov on GitHub (Sep 14, 2023). ### NetBox version v3.6.1 ### Python version 3.10 ### Steps to Reproduce 1. Create a sample plugin. **models.py** will be enough, all other web-related stuff is not required ``` # models.py from django.db import models from netbox.models import NetBoxModel from dcim.models import DeviceType class SomeModel(NetBoxModel): device_types = models.ManyToManyField(DeviceType, related_name="+") ``` 2. Create DeviceType object. All the properties doesn't matter 3. Create SomeModel object, bind device type from step 2 to it. 4. Try to call **serialize_object** for the object created at step 3 ``` from dcim.models import DeviceType from testplugin.models import SomeModel from utilities.utils import serialize_object device_type = DeviceType.objects.all()[0] my_model = SomeModel.objects.create() my_model.device_types.set([device_type]) serialize_object(my_model) # RecursionError: maximum recursion depth exceeded ``` ### Expected Behavior **serialize_object(my_model)** doesn't lead to ~StackOverflow~ RecursionError ### Observed Behavior RecursionError was raised. As you know serialize_object() is called during form.save(). So this issue isn't just "theoretical"
adam closed this issue 2025-12-29 20:38:56 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#8615