netbox-community / pynetbox

Python API client library for Netbox.
Apache License 2.0
538 stars 165 forks source link

Can't reset object attribute to its initial value. #586

Open endreszabo opened 9 months ago

endreszabo commented 9 months ago

pynetbox version

v7.0.1

NetBox version

v3.6.1

Python version

3.11

Steps to Reproduce

Consider this simple modifying of a given attribute:

>>> import pynetbox
>>> nb=pynetbox.api('http://127.0.0.1:8000', 'yada')
>>> br_native = nb.dcim.interfaces.get(id=411)
>>> eth3 = nb.dcim.interfaces.get(id=415)
>>> eth3.bridge
br-native
>>> eth3.bridge = None
>>> eth3.save()
True
>>> eth3.bridge = br_native
>>> eth3.save()
False

#and, for added confusion, changing to another bridge works again.
>>> br_users = nb.dcim.interfaces.get(id=412)
>>> eth3.bridge = br_users
>>> eth3.save()
True

Expected Behavior

This happens because _diff() in response.py returns False as the desired state matches its initial internal state, coming from the _init_cache list.

We've been here many times. Yes, I know I should have called .full_details() after the .save() to have the attributes fetched and populated again. Yes, I know pynetbox is not an ORM and it just abstracts API calls, but let's be honest, this whole way of working is highly misleading, especially for newbies.

Observed Behavior

I propose to: