mirror of
https://github.com/django/django.git
synced 2024-12-22 17:16:24 +00:00
Fixed #35974 - test only _state.adding to assert that an object is unsaved in RelatedManager.add and GenericRelatedObjectManager.add
This commit is contained in:
parent
c075d4c2c8
commit
da74631d9f
@ -692,7 +692,7 @@ def create_generic_related_manager(superclass, rel):
|
|||||||
if bulk:
|
if bulk:
|
||||||
pks = []
|
pks = []
|
||||||
for obj in objs:
|
for obj in objs:
|
||||||
if obj._state.adding or obj._state.db != db:
|
if obj._state.adding:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"%r instance isn't saved. Use bulk=False or save "
|
"%r instance isn't saved. Use bulk=False or save "
|
||||||
"the object first." % obj
|
"the object first." % obj
|
||||||
|
@ -820,7 +820,7 @@ def create_reverse_many_to_one_manager(superclass, rel):
|
|||||||
pks = []
|
pks = []
|
||||||
for obj in objs:
|
for obj in objs:
|
||||||
check_and_update_obj(obj)
|
check_and_update_obj(obj)
|
||||||
if obj._state.adding or obj._state.db != db:
|
if obj._state.adding:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"%r instance isn't saved. Use bulk=False or save "
|
"%r instance isn't saved. Use bulk=False or save "
|
||||||
"the object first." % obj
|
"the object first." % obj
|
||||||
|
26
tests/multiple_database/fixtures/replica.json
Normal file
26
tests/multiple_database/fixtures/replica.json
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"pk": 1,
|
||||||
|
"model": "multiple_database.book",
|
||||||
|
"fields": {
|
||||||
|
"title": "The Definitive Guide to Django",
|
||||||
|
"published": "2009-7-8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pk": 1,
|
||||||
|
"model": "multiple_database.person",
|
||||||
|
"fields": {
|
||||||
|
"name": "Tim Graham"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pk": 1,
|
||||||
|
"model": "multiple_database.review",
|
||||||
|
"fields": {
|
||||||
|
"source": "Python Weekly",
|
||||||
|
"content_type": 1,
|
||||||
|
"object_id": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
@ -1125,10 +1125,6 @@ class QueryTestCase(TestCase):
|
|||||||
review1.content_object = dive
|
review1.content_object = dive
|
||||||
|
|
||||||
# Add to a foreign key set with an object from a different database
|
# Add to a foreign key set with an object from a different database
|
||||||
msg = (
|
|
||||||
"<Review: Python Monthly> instance isn't saved. "
|
|
||||||
"Use bulk=False or save the object first."
|
|
||||||
)
|
|
||||||
with self.assertRaisesMessage(ValueError, msg):
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
with transaction.atomic(using="other"):
|
with transaction.atomic(using="other"):
|
||||||
dive.reviews.add(review1)
|
dive.reviews.add(review1)
|
||||||
@ -1502,18 +1498,15 @@ class RouterTestCase(TestCase):
|
|||||||
self.assertEqual(Book.objects.using("default").count(), 1)
|
self.assertEqual(Book.objects.using("default").count(), 1)
|
||||||
self.assertEqual(Book.objects.using("other").count(), 1)
|
self.assertEqual(Book.objects.using("other").count(), 1)
|
||||||
|
|
||||||
def test_invalid_set_foreign_key_assignment(self):
|
def test_invalid_set_unsaved_assignment(self):
|
||||||
marty = Person.objects.using("default").create(name="Marty Alchin")
|
marty = Person.objects.using("default").create(name="Marty Alchin")
|
||||||
dive = Book.objects.using("other").create(
|
dive = Book(
|
||||||
title="Dive into Python",
|
title="Dive into Python",
|
||||||
published=datetime.date(2009, 5, 4),
|
published=datetime.date(2009, 5, 4),
|
||||||
)
|
)
|
||||||
# Set a foreign key set with an object from a different database
|
# Set a foreign key set with an object from a different database
|
||||||
msg = (
|
msg = "Model instances without primary key value are unhashable"
|
||||||
"<Book: Dive into Python> instance isn't saved. Use bulk=False or save the "
|
with self.assertRaisesMessage(TypeError, msg):
|
||||||
"object first."
|
|
||||||
)
|
|
||||||
with self.assertRaisesMessage(ValueError, msg):
|
|
||||||
marty.edited.set([dive])
|
marty.edited.set([dive])
|
||||||
|
|
||||||
def test_foreign_key_cross_database_protection(self):
|
def test_foreign_key_cross_database_protection(self):
|
||||||
@ -2556,3 +2549,95 @@ class RelationAssignmentTests(SimpleTestCase):
|
|||||||
profile = UserProfile()
|
profile = UserProfile()
|
||||||
with self.assertRaisesMessage(ValueError, self.router_prevents_msg):
|
with self.assertRaisesMessage(ValueError, self.router_prevents_msg):
|
||||||
user.userprofile = profile
|
user.userprofile = profile
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(DATABASE_ROUTERS=[TestRouter()])
|
||||||
|
class ReadWriteClusterTests(TestCase):
|
||||||
|
"""see ticket #35974"""
|
||||||
|
|
||||||
|
databases = {"default", "other"}
|
||||||
|
fixtures = ["replica"]
|
||||||
|
|
||||||
|
def test_reverse_many_to_one_add(self):
|
||||||
|
person = Person.objects.get(name="Tim Graham")
|
||||||
|
book = Book.objects.get(title="The Definitive Guide to Django")
|
||||||
|
person.edited.add(book)
|
||||||
|
self.assertEqual(
|
||||||
|
list(Person.objects.using("default").get(name="Tim Graham").edited.all()),
|
||||||
|
[book],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_reverse_many_to_one_set(self):
|
||||||
|
person = Person.objects.get(name="Tim Graham")
|
||||||
|
book = Book.objects.get(title="The Definitive Guide to Django")
|
||||||
|
person.edited.set([book])
|
||||||
|
self.assertEqual(
|
||||||
|
list(Person.objects.using("default").get(name="Tim Graham").edited.all()),
|
||||||
|
[book],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_reverse_many_to_one_add_unsaved(self):
|
||||||
|
person = Person.objects.get(name="Tim Graham")
|
||||||
|
book = Book(
|
||||||
|
title="The Definitive Guide to Django",
|
||||||
|
published=datetime.date(2009, 7, 8),
|
||||||
|
)
|
||||||
|
msg = (
|
||||||
|
"<Book: The Definitive Guide to Django> instance isn't saved."
|
||||||
|
" Use bulk=False or save the object first."
|
||||||
|
)
|
||||||
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
|
person.edited.add(book)
|
||||||
|
|
||||||
|
def test_reverse_many_to_one_set_unsaved(self):
|
||||||
|
person = Person.objects.get(name="Tim Graham")
|
||||||
|
book = Book(
|
||||||
|
title="The Definitive Guide to Django",
|
||||||
|
published=datetime.date(2009, 7, 8),
|
||||||
|
)
|
||||||
|
msg = "Model instances without primary key value are unhashable"
|
||||||
|
with self.assertRaisesMessage(TypeError, msg):
|
||||||
|
person.edited.set([book])
|
||||||
|
|
||||||
|
def test_generic_related_add(self):
|
||||||
|
book = Book.objects.get(title="The Definitive Guide to Django")
|
||||||
|
review = Review.objects.get(source="Python Weekly")
|
||||||
|
book.reviews.add(review)
|
||||||
|
self.assertEqual(
|
||||||
|
list(
|
||||||
|
Book.objects.using("default")
|
||||||
|
.get(title="The Definitive Guide to Django")
|
||||||
|
.reviews.all()
|
||||||
|
),
|
||||||
|
[review],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_generic_related_set(self):
|
||||||
|
book = Book.objects.get(title="The Definitive Guide to Django")
|
||||||
|
review = Review.objects.get(source="Python Weekly")
|
||||||
|
book.reviews.set([review])
|
||||||
|
self.assertEqual(
|
||||||
|
list(
|
||||||
|
Book.objects.using("default")
|
||||||
|
.get(title="The Definitive Guide to Django")
|
||||||
|
.reviews.all()
|
||||||
|
),
|
||||||
|
[review],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_generic_related_add_unsaved(self):
|
||||||
|
book = Book.objects.get(title="The Definitive Guide to Django")
|
||||||
|
review = Review(source="Python Weekly")
|
||||||
|
msg = (
|
||||||
|
"<Review: Python Weekly> instance isn't saved."
|
||||||
|
" Use bulk=False or save the object first."
|
||||||
|
)
|
||||||
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
|
book.reviews.add(review)
|
||||||
|
|
||||||
|
def test_generic_related_set_unsaved(self):
|
||||||
|
book = Book.objects.get(title="The Definitive Guide to Django")
|
||||||
|
review = Review(source="Python Weekly")
|
||||||
|
msg = "Model instances without primary key value are unhashable"
|
||||||
|
with self.assertRaisesMessage(TypeError, msg):
|
||||||
|
book.reviews.set([review])
|
||||||
|
Loading…
Reference in New Issue
Block a user