#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.