#36235: RelatedManager.all().get_or_create() does not work -------------------------------------+------------------------------------- Reporter: Nick Pope | Type: Bug Status: new | Component: Database | layer (models, ORM) Version: dev | Severity: Normal Keywords: get_or_create, | Triage Stage: related, manager | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- When accessing the queryset for a related manager, `.get_or_create()` and `.update_or_create()` lose context of the related instance.
Calling on the related manager works as expected: {{{#!python publisher.books.get_or_create(name="The Very Hungry Caterpillar") }}} This is the case that was fixed by #3121 and #23611. But calling on the queryset causes an `IntegrityError` to be raised: {{{#!python publisher.books.all().get_or_create(name="The Very Hungry Caterpillar") }}} This can be a subtle failure that is hard to understand, especially if `publisher.books.all()` is assigned to a variable earlier. The challenge here is that the overridden methods on the manager set `kwargs[self.field.name] = self.instance`. We'd need to be able to pass this information down to the queryset. It looks like this might already be available in `_known_related_objects` which is set by `RelatedManager._apply_rel_filters()`, so that would be a good starting point for investigation. If this is something we can't fix reliably, then we should update the admonition under [https://docs.djangoproject.com/en/stable/ref/models/querysets/#get-or- create .get_or_create()] in the docs and probably update [https://docs.djangoproject.com/en/stable/ref/models/querysets/#update-or- create .update_or_create()] to make this and other issues related to use through `RelatedManager` more clear. -- Ticket URL: <https://code.djangoproject.com/ticket/36235> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/django-updates/010701957054856f-8a78ccdd-cf5a-498b-9835-121ea7250656-000000%40eu-central-1.amazonses.com.