#35566: Support get_FOO_display() on GeneratedField
-------------------------------------+-------------------------------------
     Reporter:  Ronie Martinez       |                    Owner:  nobody
         Type:  New feature          |                   Status:  new
    Component:  Database layer       |                  Version:  5.0
  (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
-------------------------------------+-------------------------------------
Comment (by Sarah Boyce):

 Hello Ronie!

 I think that the use of "choices" in a GeneratedField is key here as
 there's some specific logic for get_FIELD_display() when choices is set.

 For me to be sure, can you share what error you received here (or some
 more specifics on how it didn't work if there's no error)?

 If you got an error like: `AttributeError: 'Bar' object has no attribute
 'get_FOO_display'. Did you mean: 'get_something_else_display'?`

 Then I think I understand the issue and have replicated (sample failing
 test attached below).

 It's also possible you received this error: `AttributeError: Cannot read a
 generated field from an unsaved model.` if `get_FOO_display` was called
 before the model saved (related to #35560). If this is the issue, can you
 share a bit more about when this gets called? Maybe sharing your model's
 GeneratedField would also help 🙂


 {{{#!diff
 diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py
 index 652c808b40..3cc856db83 100644
 --- a/tests/model_fields/models.py
 +++ b/tests/model_fields/models.py
 @@ -72,6 +72,18 @@ class WhizIterEmpty(models.Model):
      c = models.CharField(choices=iter(()), blank=True, max_length=1)


 +class WhizGenerated(models.Model):
 +    c = models.IntegerField(choices=Whiz.CHOICES, null=True)
 +    c_copy = models.GeneratedField(
 +        expression=F("c"),
 +        output_field=models.IntegerField(choices=Whiz.CHOICES,
 null=True),
 +        db_persist=True,
 +    )
 +
 +    class Meta:
 +        required_db_features = {"supports_stored_generated_columns"}
 +
 +
  class Choiceful(models.Model):
      class Suit(models.IntegerChoices):
          DIAMOND = 1, "Diamond"
 diff --git a/tests/model_fields/tests.py b/tests/model_fields/tests.py
 index 36e54d4b8b..8d7caf7072 100644
 --- a/tests/model_fields/tests.py
 +++ b/tests/model_fields/tests.py
 @@ -17,6 +17,7 @@ from .models import (
      WhizDelayed,
      WhizIter,
      WhizIterEmpty,
 +    WhizGenerated,
  )


 @@ -297,6 +298,16 @@ class GetFieldDisplayTests(SimpleTestCase):
          self.assertEqual(WhizIterEmpty(c="").c, "")  # Empty value


 +class GetFieldDisplayGeneratedTests(TestCase):
 +    def test_choices_and_field_display(self):
 +        wg_0 = WhizGenerated.objects.create(c=0)
 +        wg_1 = WhizGenerated.objects.create(c=1)
 +        wg_none = WhizGenerated.objects.create(c=None)
 +        self.assertEqual(wg_0.get_c_copy_display(), "Other")
 +        self.assertEqual(wg_1.get_c_copy_display(), "First")
 +        self.assertIsNone(wg_none.get_c_display())
 +
 +
  class GetChoicesTests(SimpleTestCase):
      def test_empty_choices(self):
          choices = []
 }}}
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35566#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701906d8762dd-2fc1f96a-2373-4240-8055-5c77e0067eeb-000000%40eu-central-1.amazonses.com.

Reply via email to