Opened 4 months ago
Last modified 4 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.