Opened 10 years ago

Closed 10 years ago

#22450 closed Uncategorized (invalid)

Error when model.save(force_insert=True)

Reported by: vcajes@… 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.

Change History (1)

comment:1 by Simon Charette, 10 years ago

Resolution: invalid
Status: newclosed

You actually made an error when overriding Model.save(), you're not correctly passing over args and kwargs.

def save(self, *args, **kwargs):
    if not self.pk:
        self.created = timezone.now()
    super(Company, self).save(*args, **kwargs)

Notice the * before args and the double one before kwargs.

See TicketClosingReasons/UseSupportChannels.

Note: See TracTickets for help on using tickets.
Back to Top