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

#django #django-models #django-mptt

#джанго #джанго-модели #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 — по причинам, которые слишком долго описывать здесь) я делаю что-то вроде этого:

 {% for comment in comments %}  {% render_comment comment %} lt;!-- my own templatetag that renders as I wish --gt; {% endfor %}  

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

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

Мои вопросы таковы:

  1. Как я могу сначала отобразить комментарии с последними?
  2. Как я могу фильтровать объекты комментариев с помощью пользовательского менеджера моделей, чтобы я мог вызывать это вместо all() ?