I need will create two sortable fields in Django admin by values in 
Though-Model.
    
-----------------
My models.py
----------------
    
    
    from django.core.urlresolvers import reverse
    from django.utils.translation import ugettext_lazy as _
    from django.db import models
    from django.conf import settings
    
    from autoslug import AutoSlugField
    
    from mylabour.models import TimeStampedModel
    from mylabour.utils import CHOICES_LEXERS
    
    
    class Snippet(TimeStampedModel):
        """
    
        """
    
        title = models.CharField(_('Title'), max_length=200)
        slug_title = AutoSlugField(populate_from='title', 
unique_with='author', always_update=True, sep='__')
        description = models.TextField(_('Decription'))
        code = models.TextField(_('Code'))
        # tags
        lexer = models.CharField(_('Lexer of code'), max_length=50, 
choices=CHOICES_LEXERS)
        author = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            verbose_name=_('Author'),
            related_name='snippets',
            on_delete=models.DO_NOTHING,
        )
        voted_users = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            verbose_name=_('Voted users'),
            related_name='voted_users',
            through='VoteUserInSnippet',
            through_fields=('snippet', 'user'),
        )
    
        class Meta:
            db_table = 'snippet'
            verbose_name = _("Snippet")
            verbose_name_plural = _("Snippets")
            get_latest_by = 'date_created'
            ordering = ['date_created']
    
        def __str__(self):
            return '{0.title}'.format(self)
    
        def get_absolute_url(self):
            return reverse('app_snippets:snippet', kwargs={'slug_title': 
self.slug_title})
    
    
    class VoteUserInSnippet(models.Model):
    
        user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
            verbose_name='User',
            limit_choices_to={'is_active': True},
        )
        snippet = models.ForeignKey('Snippet', on_delete=models.CASCADE, 
verbose_name='Snippet')
        is_useful = models.BooleanField(_('Is useful'))
        date_voting = models.DateTimeField(_('Date voting'), 
auto_now_add=True)
    
        def __str__(self):
            return _('User "{0.user}" found this snippet as 
{0.is_useful}').format(self)
    
    
    class SnippetComment(TimeStampedModel):
    
        text_comment = models.TextField(_('Text comment'))
        snippet = models.ForeignKey('Snippet', related_name='comments', 
verbose_name=_('Snippet'), on_delete=models.CASCADE)
        author = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            related_name='comments_snippet',
            verbose_name=_('Author'),
            on_delete=models.DO_NOTHING,
        )
    
        class Meta:
            db_table = 'snippet_comment'
            verbose_name = "Comment of snippet"
            verbose_name_plural = "Comments of snippet"
            get_latest_by = 'date_created'
            ordering = ['snippet', 'date_created']
    
        def __str__(self):
            return _('Comment from "{0.author}" on snippet 
"{0.snippet}"').format(self)
    
-----------
My admin.py
-----------
    
    
    from django.db.models import Count
    from django.utils.translation import ugettext_lazy as _
    from django.contrib import admin
    
    from .models import *
    
    
    class SnippetCommentInline(admin.StackedInline):
        '''
        Stacked Inline View for SnippetComment
        '''
    
        model = SnippetComment
        min_num = 0
        max_num = None
        extra = 1
        fk_name = 'snippet'
    
    
    class VoteUserInSnippetInline(admin.TabularInline):
        '''
        Stacked Inline View for VoteUserInSnippet
        '''
    
        model = VoteUserInSnippet
        min_num = 0
        max_num = None
        extra = 1
    
    
    class SnippetAdmin(admin.ModelAdmin):
        '''
        Admin View for Snippet
        '''
    
        list_display = (
            'title',
            'author',
            'lexer',
            'get_count_good_reply',
            'get_count_bad_reply',
            'get_count_replies',
            'is_new',
            'date_modified',
            'date_created',
        )
        list_filter = (
            ('author', admin.RelatedOnlyFieldListFilter),
            'lexer',
            'date_modified',
            'date_created',
        )
        inlines = [
            SnippetCommentInline,
            VoteUserInSnippetInline,
        ]
        search_fields = ('title',)
    
        def get_queryset(self, request):
            qs = super(SnippetAdmin, self).get_queryset(request)
            qs = qs.annotate(
                count_comments=Count('comments', distinct=True),
                count_voted_users=Count('voted_users', distinct=True),
            )
            return qs
    
        def get_count_comments(self, obj):
            return obj.count_comments
        get_count_comments.admin_order_field = 'count_comments'
        get_count_comments.short_order = _('Count comments')
    
        def get_count_good_replies(self, obj):
            return VoteUserInSnippet.objects.filter(snippet=obj,     
is_useful=True).count()
        # get_count_good_replies.admin_order_field = ''
        get_count_good_replies.short_order = _('Count good replies')
    
        def get_count_bad_replies(self, obj):
            return VoteUserInSnippet.objects.filter(snippet=obj, 
is_useful=False).count()
        # get_count_bad_replies.admin_order_field = ''
        get_count_bad_replies.short_order = _('Count bad replies')
    
        def get_count_replies(self, obj):
            return obj.count_voted_users
        get_count_replies.admin_order_field = 'count_voted_users'
        get_count_replies.short_order = _('Count replies')
    
    
    class VoteUserInSnippetAdmin(admin.ModelAdmin):
        '''
        Admin View for VoteUserInSnippet
        '''
        list_display = ('snippet', 'user', 'is_useful', 'date_voting')
        list_filter = (
            ('user', admin.RelatedOnlyFieldListFilter),
            ('snippet', admin.RelatedOnlyFieldListFilter),
            'is_useful',
            'date_voting',
        )
    
    
    class SnippetCommentAdmin(admin.ModelAdmin):
        '''
            Admin View for SnippetComment
        '''
        list_display = ('snippet', 'author', 'is_new', 'date_modified', 
'date_created')
        list_filter = (
            ('author', admin.RelatedOnlyFieldListFilter),
            ('snippet', admin.RelatedOnlyFieldListFilter),
            'date_modified',
            'date_created',
        )



Methods get_count_bad_replies() and get_count_bad_replies() right worked 
but is not sortable. 
May be who known have resolve this problem.

Thanks.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" 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].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/140f0b6b-2985-4a32-abc9-762edc199931%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to