Django-mptt порядок сортировки не соответствует ожидаемому - и нельзя применить фильтрацию

Я использую Django 3.2 и django-mptt 0.13.4

У меня есть следующие объекты:

class Comment(models.Model):
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True,  related_name='children')
    created_at = models.DateTimeField(auto_now=True)

    # ... other fields and methods

    class MPTTMeta:
      order_insertion_by = ['created_at']

    class Meta:
        permissions = [('perm_1', 'Permission 1'),
                       ('perm2', 'Permission 2'),]
        

class Commentable(models.Model):
    comments = GenericRelation(Comment)
    # ... other fields and methods
    
    class Meta:
        abstract = True


class Foo(Commentable):
    class Meta:
        abstract = False

В моем коде представления я обращаюсь к комментариям следующим образом:

class FooDetailView(DetailView):
    def get_context_data(self, **kwargs):
        context = super(FooDetailView, self).get_context_data(**kwargs)
        foo = self.get_object()

        context['comments'] = foo.comments.all() # I want to use a Models Manager instead
        
        # ...

В моем шаблоне (я не использую mptt templatetags - по причинам слишком долгим, чтобы вдаваться в них здесь), я делаю что-то вроде этого:

{% for comment in comments %}
   {% render_comment comment %} <!-- my own templatetag that renders as I wish -->
{% endfor %}

Однако, комментарии отображаются с самым ранним комментарием первым - почему?! Я попробовал следующее - и сортировка осталась неизменной:

  • Добавлен ordering атрибут `['-created_at'] в Comment::Meta
  • Привязка метода order_by('-created_at') к вызову метода all() в FooDetailView::get_context_data()

Мои вопросы следующие:

  1. How can I get the comments to be displayed with the latest first?
  2. How can I filter the comment objects using a custom model manager, so I can call that instead of all()?
Вернуться на верх