Opened 12 years ago
Closed 12 years ago
#22450 closed Uncategorized (invalid)
Error when model.save(force_insert=True)
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.6 |
| Severity: | Normal | Keywords: | model save force_insert |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I'm having an error when I add the force_insert=True parameter to a model.save call. The problem is arising in a Django Unit TestCase (from django.test import TestCase)
The model example:
class Company(models.Model): owner = models.ForeignKey(User) name = models.CharField(max_length=75) description = models.CharField(max_length=250) created = models.DateTimeField() status = models.CharField(max_length=1, choices=COMPANY_STATUS_CHOICES, default='a') def save(self, *args, **kwargs): if not self.pk: self.created = timezone.now() super(Company, self).save(args, kwargs)
The code error example:
self.company = Company(owner=self.operator, name="Company1", description="Descripcion Company1", status='a') self.company.save(force_insert=True)
And the error say it cannot force an UPDATE (I think there are some parameters that are passed in a wrong order somewhere)
Error
Traceback (most recent call last):
File "C:\Users\KGs\Documents\Coupoints\wsgi\openshift\points\tests.py", line 36, in setUp
self.company.save(force_insert=True)
File "C:\Users\KGs\Documents\Coupoints\wsgi\openshift\business\models.py", line 49, in save
super(Company, self).save(args, kwargs)
File "C:\VirtualEnvs\CoupointsEnv\lib\site-packages\django\db\models\base.py", line 545, in save
force_update=force_update, update_fields=update_fields)
File "C:\VirtualEnvs\CoupointsEnv\lib\site-packages\django\db\models\base.py", line 573, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "C:\VirtualEnvs\CoupointsEnv\lib\site-packages\django\db\models\base.py", line 626, in _save_table
raise ValueError("Cannot force an update in save() with no primary key.")
ValueError: Cannot force an update in save() with no primary key.
The problem is in here:
In the file django.db.models.base.py in the function:
def _save_table(self, raw=False, cls=None, force_insert=False, force_update=False, using=None, update_fields=None):
If you print the parameters force_insert, force_update, update_fields just before the:
if not pk_set and (force_update or update_fields):
raise ValueError("Cannot force an update in save() with no primary key.")
You will see that force_insert is None and force_update has the value {'force_insert': True}, and thats the problem.
Its an easy to solve problem. Y just wanted to report. Thanks.
You actually made an error when overriding
Model.save(), you're not correctly passing overargsandkwargs.Notice the
*beforeargsand the double one beforekwargs.See TicketClosingReasons/UseSupportChannels.