Opened 5 years ago

Closed 5 years ago

#22450 closed Uncategorized (invalid)

Error when

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


I'm having an error when I add the force_insert=True parameter to a 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.created =
		super(Company, self).save(args, kwargs)

The code error example: = Company(owner=self.operator, name="Company1", description="Descripcion Company1", status='a')

And the error say it cannot force an UPDATE (I think there are some parameters that are passed in a wrong order somewhere)

Traceback (most recent call last):
  File "C:\Users\KGs\Documents\Coupoints\wsgi\openshift\points\", line 36, in setUp
  File "C:\Users\KGs\Documents\Coupoints\wsgi\openshift\business\", line 49, in save
    super(Company, self).save(args, kwargs)
  File "C:\VirtualEnvs\CoupointsEnv\lib\site-packages\django\db\models\", line 545, in save
    force_update=force_update, update_fields=update_fields)
  File "C:\VirtualEnvs\CoupointsEnv\lib\site-packages\django\db\models\", 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\", 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 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 Changed 5 years ago by Simon Charette

Resolution: invalid
Status: newclosed

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

def save(self, *args, **kwargs):
    if not
        self.created =
    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