#15082 closed (invalid)
delete() does not function consistently with CharField PKs
Reported by: | w004dal | Owned by: | nobody |
---|---|---|---|
Component: | Core (Other) | Version: | 1.2 |
Severity: | Keywords: | model, db | |
Cc: | w004dal@… | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | yes |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
I'm working with MyISAM tables with MySQL and have the following behavior with delete() on Django 1.2.3-1 on Fedora Core 12.
class DoesWork(models.Model): mac_id = models.CharField(max_length=17) ip = models.CharField('Host/IP Address', max_length=255) class DoesNotWork(models.Model): mac_id = models.CharField(max_length=17, primary_key=True) ip = models.CharField('Host/IP Address', max_length=255)
The following works as expected, creating, deleting, and putting the item back:
zz = DoesWork.objects.create(mac_id='99:99:99:99:99:99', ip='127.0.0.1') zz.delete() # remove from DB zz.save() # it's back in the DB
However, if I use the DoesNotWork model, whose only difference is having a CharField as a primary key:
zz = DoesNotWork.objects.create(mac_id='99:99:99:99:99:99', ip='127.0.0.1') zz.delete() # remove from DB zz.save() # EXCEPTION THROWN: IntegrityError: (1048, "Column 'mac_id' cannot be null")
I checked by printing out zz.__dict__, and the mac_id was 'None' with the DoesNotWork object, but was untouched with the DoesWork object.
Change History (5)
comment:1 by , 14 years ago
Description: | modified (diff) |
---|
comment:2 by , 14 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
This is working as expected. When you delete the object, it's primary key is set to None. In the model DoesNotWork, the primary key is manually allocated, so subsequent saves are prevented. In the model DoesWork, the primary key is automatically allocated, so a new object is inserted.
comment:3 by , 14 years ago
Needs documentation: | set |
---|
What is the expected behavior for the class below? DoesWork
should be syntactic sugar for DoesNotWorkToo:
class DoesNotWorkToo(models.Model): some_key = models.IntegerField(primary_key=True) mac_id = models.CharField(max_length=17) ip = models.CharField('Host/IP Address', max_length=255)
comment:5 by , 14 years ago
Please reopen this bug to at least improve the documentation on http://docs.djangoproject.com/en/dev/topics/db/queries to include this subtlety.
Corrected formatting. Please use preview.