如何在Django Admin中设置多对多字段按最新优先排序显示
解决Django Admin里TestSeries关联内容的排序问题
先修正你model代码里的两个小问题:
id = models.AutoField得加括号,改成id = models.AutoField(primary_key=True)——其实Django默认会自动生成主键id,这个字段完全可以省略- 多对多关联的
MyQuestion写错了,应该是Question,你的模型类叫Question
修正后的基础代码:
class Question(models.Model): question = models.CharField(max_length=100) answer = models.CharField(max_length=100) class TestSeries(models.Model): quiz_name = models.CharField(max_length=100) all_question = models.ManyToManyField(Question)
接下来给你两种改排序的方法,按需选择:
方法一:全局设置Question的默认排序
直接在Question模型里加Meta类,指定按id倒序,这样所有地方查询Question都是最新创建的在前:
class Question(models.Model): question = models.CharField(max_length=100) answer = models.CharField(max_length=100) class Meta: ordering = ['-id'] # 负号表示倒序,id越大(创建时间越晚)排得越靠前
方法二:仅在TestSeries的Admin页面修改排序
如果不想影响其他场景下的Question排序,只改TestSeries Admin里的关联内容顺序,就自定义Admin类:
from django.contrib import admin from .models import TestSeries, Question class TestSeriesAdmin(admin.ModelAdmin): # 可选配置:用水平选择器,已选内容会跟随查询集的排序规则显示 filter_horizontal = ('all_question',) def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == 'all_question': # 指定关联的Question按id倒序查询 kwargs['queryset'] = Question.objects.order_by('-id') return super().formfield_for_manytomany(db_field, request, **kwargs) admin.site.register(TestSeries, TestSeriesAdmin) admin.site.register(Question)
设置完成后,打开TestSeries的Admin页面,已添加的关联Question就会按最新优先的顺序显示了。
内容的提问来源于stack exchange,提问作者Raj Subh
相关产品推荐
相关产品推荐

