Opened 7 years ago

Closed 7 years ago

#30531 closed Bug (invalid)

Exception when creating an inherited model object with existing base

Reported by: Victor Porton Owned by: nobody
Component: Database layer (models, ORM) Version: 2.2
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The following intuitively right causes an exception:

class Base(models.Model):
    v = models.IntegerField()

class Derived(Base):
    base = models.OneToOneField(Base, on_delete=models.CASCADE, primary_key=True)

class BugTestCase(TestCase):
    def setUp(self):
        self.base = Base.objects.create(v=0)

    def test_bug(self):
        Derived.objects.create(base=self.base)

Here it is:

django.db.utils.IntegrityError: NOT NULL constraint failed: mytest_base.v

It should work in the expected way not to raise an exception.

In the project I am developing now, I am going to write a workaround with a raw SQL query :-(

I will attach full test source.

Attachments (1)

django-create-inherited-bug.tar.gz​ (2.8 KB ) - added by Victor Porton 7 years ago.
Source which causes the bug

Download all attachments as: .zip

Change History (2)

by Victor Porton, 7 years ago

Source which causes the bug

comment:1 by Simon Charette, 7 years ago

Resolution: → invalid
Status: new → closed

If you want to use Derived.base as your inheritance parent link you have to ​mark it accordingly.

Right now your table Derived model has two o2o fields pointing at Base; the explicit one you defined and the implicit parent link base_ptr. When you try to create your Derived object in test_bug it's the base_ptr.v field value that is missing.

Adding parent_link=True to your Derived.base field should address your issue.

Closing per TicketClosingReasons/UseSupportChannels.

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