mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #24495 -- Allowed unsaved model instance assignment check to be bypassed.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import IntegrityError, connection, transaction
|
||||
from django.db import IntegrityError, connection, models, transaction
|
||||
from django.test import TestCase
|
||||
|
||||
from .models import (
|
||||
@@ -145,6 +145,31 @@ class OneToOneTests(TestCase):
|
||||
% (bar, p._meta.object_name)):
|
||||
p.undergroundbar = bar
|
||||
|
||||
def test_unsaved_object_check_override(self):
|
||||
"""
|
||||
#24495 - Assigning an unsaved object to a OneToOneField
|
||||
should be allowed when the allow_unsaved_instance_assignment
|
||||
attribute has been set to True.
|
||||
"""
|
||||
class UnsavedOneToOneField(models.OneToOneField):
|
||||
# A OneToOneField which can point to an unsaved object
|
||||
allow_unsaved_instance_assignment = True
|
||||
|
||||
class Band(models.Model):
|
||||
name = models.CharField(max_length=50)
|
||||
|
||||
class BandManager(models.Model):
|
||||
band = UnsavedOneToOneField(Band)
|
||||
first_name = models.CharField(max_length=50)
|
||||
last_name = models.CharField(max_length=50)
|
||||
|
||||
band = Band(name='The Beatles')
|
||||
manager = BandManager(first_name='Brian', last_name='Epstein')
|
||||
# This should not raise an exception as the OneToOneField between
|
||||
# manager and band has allow_unsaved_instance_assignment=True.
|
||||
manager.band = band
|
||||
self.assertEqual(manager.band, band)
|
||||
|
||||
def test_reverse_relationship_cache_cascade(self):
|
||||
"""
|
||||
Regression test for #9023: accessing the reverse relationship shouldn't
|
||||
|
||||
Reference in New Issue
Block a user