diff options
| author | Pablo Recio <pablo@potatolondon.com> | 2013-05-19 14:15:36 +0200 |
|---|---|---|
| committer | Pablo Recio <pablo@potatolondon.com> | 2013-05-19 14:16:12 +0200 |
| commit | 65f9e0affd8ca04e2c597c43c1547ef7c888ec2a (patch) | |
| tree | a5d498bf2a020c84902698b8175f4eb03ee6ead8 /docs | |
| parent | d34b1c29e294b19e51a47918125314a1540c01d4 (diff) | |
Fixes #18896. Add tests verifying that you can get IntegrityErrors using get_or_create through relations like M2M, and it also adds a note into the documentation warning about it
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/ref/models/querysets.txt | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt index 9677b321c6..2dec00afc1 100644 --- a/docs/ref/models/querysets.txt +++ b/docs/ref/models/querysets.txt @@ -1409,6 +1409,41 @@ has a side effect on your data. For more, see `Safe methods`_ in the HTTP spec. .. _Safe methods: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 +.. warning:: + + You can use ``get_or_create()`` through :class:`~django.db.models.ManyToManyField` + attributes and reverse relations. In that case you will restrict the queries + inside the context of that relation. That could lead you to some integrity + problems if you don't use it consistently. + + Being the following models:: + + class Chapter(models.Model): + title = models.CharField(max_length=255, unique=True) + + class Book(models.Model): + title = models.CharField(max_length=256) + chapters = models.ManyToManyField(Chapter) + + You can use ``get_or_create()`` through Book's chapters field, but it only + fetches inside the context of that book:: + + >>> book = Book.objects.create(title="Ulysses") + >>> book.chapters.get_or_create(title="Telemachus") + (<Chapter: Telemachus>, True) + >>> book.chapters.get_or_create(title="Telemachus") + (<Chapter: Telemachus>, False) + >>> Chapter.objects.create(title="Chapter 1") + <Chapter: Chapter 1> + >>> book.chapters.get_or_create(title="Chapter 1") + # Raises IntegrityError + + This is happening because it's trying to get or create "Chapter 1" through the + book "Ulysses", but it can't do any of them: the relation can't fetch that + chapter because it isn't related to that book, but it can't create it either + because ``title`` field should be unique. + + bulk_create ~~~~~~~~~~~ |
