Commit dd045aaa authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #12209 -- Made the through attribute on a m2m relation into a property...

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
parent c8514b57
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -586,9 +586,13 @@ class ReverseManyRelatedObjectsDescriptor(object):
    # ReverseManyRelatedObjectsDescriptor instance.
    def __init__(self, m2m_field):
        self.field = m2m_field

    def _through(self):
        # through is provided so that you have easy access to the through
        # model (Book.authors.through) for inlines, etc.
        self.through = m2m_field.rel.through
        # model (Book.authors.through) for inlines, etc. This is done as
        # 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):
        if instance is None:
+27 −0
Original line number Diff line number Diff line
@@ -26,6 +26,19 @@ class TwoAlbumFKAndAnE(models.Model):
    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':"""

@@ -95,4 +108,18 @@ Exception: <class 'regressiontests.admin_validation.models.TwoAlbumFKAndAnE'> ha

>>> 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)

"""}