#28867: UX: Unhelpful AttributeError when a model property name ends with a
`_id`
-------------------------------+--------------------------------------
Reporter: Michael | Owner: nobody
Type: Bug | Status: new
Component: Uncategorized | Version: 1.11
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: 1
-------------------------------+--------------------------------------
Description changed by Michael:
Old description:
> **Summary**
>
> Given a model with an FK field "foo", it would be helpful if Django
> warned users when they include a property in a model named "foo_id" in
> the same model.
>
> **Steps To Reproduce**
> - Implement a model relationship that looks like Exhibit A
> - Create an instance using .create or FactoryBoy.
> - Observe the following stack trace that occurs in Exhibit B
>
> ** Expected Results**
> As a Django user, I expect the framework to warn me with a helpful error
> if I name a property method that doesn't play nice with Django's ORM.
>
>
> {{{
> // Exhibit A
>
> class Foo(models.Model):
> pass
>
> Class Bar(model.Modal):
> foo = models.FK(Foo)
>
> @property
> def foo_id(self):
> return self.foo.id
> }}}
>
>
> {{{
> // Exhibit B
> Traceback (most recent call last):
> File "./manage.py", line 22, in <module>
> execute_from_command_line(sys.argv)
> File "/usr/local/lib/python3.6/dist-
> packages/django/core/management/__init__.py", line 364, in
> execute_from_command_line
> utility.execute()
> File "/usr/local/lib/python3.6/dist-
> packages/django/core/management/__init__.py", line 356, in execute
> self.fetch_command(subcommand).run_from_argv(self.argv)
> File "/usr/local/lib/python3.6/dist-
> packages/django/core/management/base.py", line 283, in run_from_argv
> self.execute(*args, **cmd_options)
> File "/usr/local/lib/python3.6/dist-
> packages/django/core/management/base.py", line 330, in execute
> output = self.handle(*args, **options)
> File "/usr/local/lib/python3.6/dist-
> packages/django/core/management/commands/shell.py", line 101, in handle
> exec(sys.stdin.read())
> File "<string>", line 1, in <module>
> File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line 46,
> in __call__
> return cls.create(**kwargs)
> File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line
> 568, in create
> return cls._generate(enums.CREATE_STRATEGY, kwargs)
> File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line
> 505, in _generate
> return step.build()
> File "/usr/local/lib/python3.6/dist-packages/factory/builder.py", line
> 279, in build
> kwargs=kwargs,
> File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line
> 314, in instantiate
> return self.factory._create(model, *args, **kwargs)
> File "/usr/local/lib/python3.6/dist-packages/factory/django.py", line
> 165, in _create
> return manager.create(*args, **kwargs)
> File "/usr/local/lib/python3.6/dist-
> packages/django/db/models/manager.py", line 85, in manager_method
> return getattr(self.get_queryset(), name)(*args, **kwargs)
> File "/usr/local/lib/python3.6/dist-
> packages/django/db/models/query.py", line 392, in create
> obj = self.model(**kwargs)
> File "/usr/local/lib/python3.6/dist-packages/django/db/models/base.py",
> line 555, in __init__
> _setattr(self, field.name, rel_obj)
> File "/usr/local/lib/python3.6/dist-
> packages/django/db/models/fields/related_descriptors.py", line 253, in
> __set__
> setattr(instance, lh_field.attname, getattr(value, rh_field.attname))
> AttributeError: can't set attribute
> }}}
New description:
**Summary**
Given a model with a foreign key field "foo", it would be helpful if
Django warned users when they include a property in the model named
"foo_id" in the same model.
**Steps To Reproduce**
- Implement a relationship that looks like Exhibit A
- Create an instance of `Bar` using .create or FactoryBoy.
- Observe the following stack trace that occurs in Exhibit B
** Expected Results**
As a Django user, I expect the framework to warn me with a helpful error
if I name a property method that doesn't play nice with Django's ORM.
{{{
// Exhibit A
class Foo(models.Model):
pass
Class Bar(model.Modal):
foo = models.FK(Foo)
@property
def foo_id(self):
return self.foo.id
}}}
{{{
// Exhibit B
Traceback (most recent call last):
File "./manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.6/dist-
packages/django/core/management/__init__.py", line 364, in
execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.6/dist-
packages/django/core/management/__init__.py", line 356, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.6/dist-
packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.6/dist-
packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.6/dist-
packages/django/core/management/commands/shell.py", line 101, in handle
exec(sys.stdin.read())
File "<string>", line 1, in <module>
File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line 46,
in __call__
return cls.create(**kwargs)
File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line 568,
in create
return cls._generate(enums.CREATE_STRATEGY, kwargs)
File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line 505,
in _generate
return step.build()
File "/usr/local/lib/python3.6/dist-packages/factory/builder.py", line
279, in build
kwargs=kwargs,
File "/usr/local/lib/python3.6/dist-packages/factory/base.py", line 314,
in instantiate
return self.factory._create(model, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/factory/django.py", line
165, in _create
return manager.create(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-
packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/django/db/models/query.py",
line 392, in create
obj = self.model(**kwargs)
File "/usr/local/lib/python3.6/dist-packages/django/db/models/base.py",
line 555, in __init__
_setattr(self, field.name, rel_obj)
File "/usr/local/lib/python3.6/dist-
packages/django/db/models/fields/related_descriptors.py", line 253, in
__set__
setattr(instance, lh_field.attname, getattr(value, rh_field.attname))
AttributeError: can't set attribute
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/28867#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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/065.d0d26553ee15c0653d43fa62e6c78cc2%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.