Opened 11 years ago
Closed 11 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 overargs
andkwargs
.Notice the
*
beforeargs
and the double one beforekwargs
.See TicketClosingReasons/UseSupportChannels.