Fixed #10738 -- Fixed content type values for deferred and proxy models.
Models with deferred fields, or which are proxying for an existing model, now return the same ContentType object as the real model they reflect. Thanks to tomasz.elendt for help with fixing this. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10523 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
e12e0e18a4
commit
92824e7102
|
@ -15,6 +15,9 @@ class ContentTypeManager(models.Manager):
|
||||||
for the same model don't hit the database.
|
for the same model don't hit the database.
|
||||||
"""
|
"""
|
||||||
opts = model._meta
|
opts = model._meta
|
||||||
|
while opts.proxy:
|
||||||
|
model = opts.proxy_for_model
|
||||||
|
opts = model._meta
|
||||||
key = (opts.app_label, opts.object_name.lower())
|
key = (opts.app_label, opts.object_name.lower())
|
||||||
try:
|
try:
|
||||||
ct = self.__class__._cache[key]
|
ct = self.__class__._cache[key]
|
||||||
|
|
|
@ -5,6 +5,7 @@ than using a new table of their own. This allows them to act as simple proxies,
|
||||||
providing a modified interface to the data from the base class.
|
providing a modified interface to the data from the base class.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,6 +172,12 @@ FieldError: Proxy model 'NoNewFields' contains model fields.
|
||||||
[<OtherPerson: barney>, <OtherPerson: fred>]
|
[<OtherPerson: barney>, <OtherPerson: fred>]
|
||||||
>>> OtherPerson._default_manager.all()
|
>>> OtherPerson._default_manager.all()
|
||||||
[<OtherPerson: barney>, <OtherPerson: wilma>]
|
[<OtherPerson: barney>, <OtherPerson: wilma>]
|
||||||
|
|
||||||
|
# A proxy has the same content type as the model it is proxying for (at the
|
||||||
|
# storage level, it is meant to be essentially indistinguishable).
|
||||||
|
>>> ctype = ContentType.objects.get_for_model
|
||||||
|
>>> ctype(Person) is ctype(OtherPerson)
|
||||||
|
True
|
||||||
"""}
|
"""}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ Regression tests for defer() / only() behavior.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.db import connection, models
|
from django.db import connection, models
|
||||||
|
|
||||||
class Item(models.Model):
|
class Item(models.Model):
|
||||||
|
@ -91,5 +92,14 @@ u'c1'
|
||||||
>>> Leaf.objects.select_related().only("child__name", "second_child__name")
|
>>> Leaf.objects.select_related().only("child__name", "second_child__name")
|
||||||
[<Leaf_Deferred_name_value: l1>]
|
[<Leaf_Deferred_name_value: l1>]
|
||||||
|
|
||||||
|
Models instances with deferred fields should still return the same content
|
||||||
|
types as their non-deferred versions (bug #10738).
|
||||||
|
>>> ctype = ContentType.objects.get_for_model
|
||||||
|
>>> c1 = ctype(Item.objects.all()[0])
|
||||||
|
>>> c2 = ctype(Item.objects.defer("name")[0])
|
||||||
|
>>> c3 = ctype(Item.objects.only("name")[0])
|
||||||
|
>>> c1 is c2 is c3
|
||||||
|
True
|
||||||
|
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue