#16508: Provide real support for virtual fields
-------------------------------------+-------------------------------------
Reporter: vzima | Owner: pirosb3
Type: New feature | Status: assigned
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by koniiiik):
I tried to dig into item number 1 from comment:10, but I've hit a snag. I
created [https://github.com/django/django/pull/6477 PR 6477] with the
work-in-progress patch.
The patch breaks the tests for `GenericRelatedObjectManager.add`, and the
reason is that before the change, `instance_pre_init` only sets the values
of the content type and primary key, but it does not cache the target
instance in `cache_attr`. However, with the change, the regular `__set__`
is called, which caches the instance as well.
The problem with this is that `GenericRelatedObjectManager.add` only
assigns the values of the content type, and the primary key, but as far as
I can see, `GenericRelatedObjectManager` does not hold any reference to
the `GenericForeignKey` field on the other side of the relationship, not
even its name (either of the two would make this problem go away). It does
not really need to, as long as it only operates with the basic values, but
it makes it impossible for me to invalidate the cached instance.
Arguably, this might be considered a bug in the current implementation,
since it is always possible to change the raw primary key of the target,
but any subsequent reads of the target object will still return the old
instance.
I can see the following ways out:
1. Make `GenericRelation` hold a reference to the corresponding
`GenericForeignKey`. This would mean that a lack of `GenericForeignKey` on
the other side would become a hard failure; right now, there's a check
that reports this situation as an error, but in theory, the
`GenericRelation` should work just fine anyway, which would no longer be
the case.
2. Reorganize `GenericForeignKey.__get__` a little bit to check that the
cached instance matches the raw values. This would mean that even if there
is already a cached instance, the content type would have to be looked up
on every read. This adds a bit of overhead, although at least content
types are cached, so it shouldn't actually hit the database most of the
time.
Presonally, I would probably prefer option 2, because it solves the more
general problem of stale cached instances, but if anyone disagrees, I'd be
happy to implement the first option, too.
--
Ticket URL: <https://code.djangoproject.com/ticket/16508#comment:15>
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/063.5692a716d74159fc743f17d14dba26ef%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.