Opened 6 months ago

Closed 6 months 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 6 months ago.
Source which causes the bug

Download all attachments as: .zip

Change History (2)

Changed 6 months ago by Victor Porton

Source which causes the bug

comment:1 Changed 6 months ago by Simon Charette

Resolution: invalid
Status: newclosed

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