Opened 16 months ago
Last modified 16 months ago
#35694 closed Cleanup/optimization
FK inconsistency beween `get_or_create` and any other orm function — at Version 1
| 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 (last modified by )
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
Note:
See TracTickets
for help on using tickets.