Fixed #12209 -- Made the through attribute on a m2m relation into a property to ensure that the fully resolved through model is always provdided. Thanks to dgouldin for the report.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11736 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c8514b570b
commit
dd045aaab5
|
@ -586,9 +586,13 @@ class ReverseManyRelatedObjectsDescriptor(object):
|
||||||
# ReverseManyRelatedObjectsDescriptor instance.
|
# ReverseManyRelatedObjectsDescriptor instance.
|
||||||
def __init__(self, m2m_field):
|
def __init__(self, m2m_field):
|
||||||
self.field = m2m_field
|
self.field = m2m_field
|
||||||
|
|
||||||
|
def _through(self):
|
||||||
# through is provided so that you have easy access to the through
|
# through is provided so that you have easy access to the through
|
||||||
# model (Book.authors.through) for inlines, etc.
|
# model (Book.authors.through) for inlines, etc. This is done as
|
||||||
self.through = m2m_field.rel.through
|
# a property to ensure that the fully resolved value is returned.
|
||||||
|
return self.field.rel.through
|
||||||
|
through = property(_through)
|
||||||
|
|
||||||
def __get__(self, instance, instance_type=None):
|
def __get__(self, instance, instance_type=None):
|
||||||
if instance is None:
|
if instance is None:
|
||||||
|
|
|
@ -26,6 +26,19 @@ class TwoAlbumFKAndAnE(models.Model):
|
||||||
e = models.CharField(max_length=1)
|
e = models.CharField(max_length=1)
|
||||||
|
|
||||||
|
|
||||||
|
class Author(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
|
||||||
|
class Book(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
authors = models.ManyToManyField(Author, through='AuthorsBooks')
|
||||||
|
|
||||||
|
|
||||||
|
class AuthorsBooks(models.Model):
|
||||||
|
author = models.ForeignKey(Author)
|
||||||
|
book = models.ForeignKey(Book)
|
||||||
|
|
||||||
|
|
||||||
__test__ = {'API_TESTS':"""
|
__test__ = {'API_TESTS':"""
|
||||||
|
|
||||||
|
@ -95,4 +108,18 @@ Exception: <class 'regressiontests.admin_validation.models.TwoAlbumFKAndAnE'> ha
|
||||||
|
|
||||||
>>> validate_inline(TwoAlbumFKAndAnEInline, None, Album)
|
>>> validate_inline(TwoAlbumFKAndAnEInline, None, Album)
|
||||||
|
|
||||||
|
# Regression test for #12203 -- If the explicitly provided through model
|
||||||
|
# is specified as a string, the admin should still be able use
|
||||||
|
# Model.m2m_field.through
|
||||||
|
|
||||||
|
>>> class AuthorsInline(admin.TabularInline):
|
||||||
|
... model = Book.authors.through
|
||||||
|
|
||||||
|
>>> class BookAdmin(admin.ModelAdmin):
|
||||||
|
... inlines = [AuthorsInline]
|
||||||
|
|
||||||
|
# If the through model is still a string (and hasn't been resolved to a model)
|
||||||
|
# the validation will fail.
|
||||||
|
>>> validate(BookAdmin, Book)
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
Loading…
Reference in New Issue