[Django] #35694: FK inconsistency beween `get_or_create` and any other orm function

5 views
Skip to first unread message

Django

unread,
Aug 20, 2024, 8:07:50 AM8/20/24
to django-...@googlegroups.com
#35694: FK inconsistency beween `get_or_create` and any other orm function
-------------------------------------+-------------------------------------
Reporter: KIC | Type:
| Cleanup/optimization
Status: new | Component: Database
| layer (models, ORM)
Version: 5.1 | Severity: Normal
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
While any orm `filter`, `get`, ... accepts a `pk` or instance
`get_or_create` does not. For consistency `get_or_create` should also be
able to handle instances and pk's interchangeably.

models.py:
```
from django.db import models


class A(models.Model):
foo = models.CharField(max_length=100)


class B(models.Model):
a = models.ForeignKey(A, on_delete=models.CASCADE)
bar = models.CharField(max_length=100)

```

tests.py
```
from testing.utils import TestCase
from zfoo import models


class TestSomething(TestCase):
def test_lala(self):
a = models.A.objects.create(foo="foo")
models.B.objects.create(a=a, bar="bar")

self.assertEqual(models.B.objects.get(a=a),
models.B.objects.get(a=a.pk))
self.assertEqual(
models.B.objects.filter(a=a).first(),
models.B.objects.filter(a=a.pk).first(),
)

models.B.objects.get_or_create(dict(bar="does not exist"),
bar="baz", a=a)
models.B.objects.get_or_create(dict(bar="does not exist"),
bar="baz", a=a.pk) # FAILS
```
--
Ticket URL: <https://code.djangoproject.com/ticket/35694>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Aug 20, 2024, 8:11:47 AM8/20/24
to django-...@googlegroups.com
#35694: FK inconsistency beween `get_or_create` and any other orm function
-------------------------------------+-------------------------------------
Reporter: KIC | Owner: (none)
Type: | Status: new
Cleanup/optimization |
Component: Database layer | Version: 5.1
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by KIC:

Old description:
New description:
--
Ticket URL: <https://code.djangoproject.com/ticket/35694#comment:1>

Django

unread,
Aug 21, 2024, 4:06:07 AM8/21/24
to django-...@googlegroups.com
#35694: FK inconsistency beween `get_or_create` and any other orm function
-------------------------------------+-------------------------------------
Reporter: KIC | Owner: (none)
Type: | Status: closed
Cleanup/optimization |
Component: Database layer | Version: 5.1
(models, ORM) |
Severity: Normal | Resolution: invalid
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Sarah Boyce):

* resolution: => invalid
* status: new => closed

Comment:

This is consistent with create - `models.B.objects.create(dict(bar="does
not exist"), bar="baz", a=a.pk)` would also raise a `ValueError`
You can use the `_id` suffix
`models.B.objects.get_or_create(dict(bar="does not exist"), bar="baz",
a_id=a.pk)` (same for create)
--
Ticket URL: <https://code.djangoproject.com/ticket/35694#comment:2>
Reply all
Reply to author
Forward
0 new messages