Opened 6 years ago

Last modified 6 years ago

#29458 closed Bug

get_field uses related_query_name instead of related_name — at Version 1

Reported by: Tomasz Knapik Owned by: nobody
Component: Documentation Version: 2.1
Severity: Normal Keywords:
Cc: Aram Dulyan Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Tomasz Knapik)

The documentation seems to mention that get_field should use related_name, but when related_query_name is defined, it uses that instead.

Let's say in situation like this...

from django.db import models


class ModelA(models.Model):
    test_model = models.ForeignKey('ModelB', models.CASCADE,
                                   related_name='model_a_related_name',
                                   related_query_name='model_a_related_q_name')


class ModelB(models.Model):
    some_field = models.CharField(max_length=255)

Using get_field with value from related_name.

>>> from testapp.models import ModelB
>>> ModelB._meta.get_field('model_a_related_name')
Traceback (most recent call last):
  File "/home/tomaszk/Projects/testsite/venv/lib64/python3.6/site-packages/django/db/models/options.py", line 566, in get_field
    return self.fields_map[field_name]
KeyError: 'model_a_related_name'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/tomaszk/Projects/testsite/venv/lib64/python3.6/site-packages/django/db/models/options.py", line 568, in get_field
    raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, field_name))
django.core.exceptions.FieldDoesNotExist: ModelB has no field named 'model_a_related_name'
>>> 

But this will work.

>>> ModelB._meta.get_field('model_a_related_q_name')
<ManyToOneRel: testapp.modela>

Change History (1)

comment:1 by Tomasz Knapik, 6 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top