Opened 3 months ago
Last modified 3 months ago
#35694 closed Cleanup/optimization
FK inconsistency beween `get_or_create` and any other orm function — at Initial Version
Reported by: | KIC | Owned by: | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 5.1 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
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
`