如何将ForeignKey字段按字母顺序排序?附models.py与form.py代码
嘿,这个需求很常见,我来给你捋两种靠谱的实现方式,分别在模型层和表单层操作,你可以根据自己的场景选:
方法一:在models.py中设置全局默认排序
如果希望这个ForeignKey关联的模型在任何场景下(包括后台管理、所有表单)都按字母顺序展示选项,最省心的方式是在关联的模型里定义排序规则。
举个例子,假设你有一个Category模型,你的主模型(比如Post)用ForeignKey关联它,那就在Category的Meta类里指定ordering字段:
# models.py from django.db import models class Category(models.Model): name = models.CharField(max_length=100) class Meta: # 按name字段升序排列(A-Z字母顺序) ordering = ['name'] def __str__(self): return self.name class Post(models.Model): title = models.CharField(max_length=200) # 这个ForeignKey的选项会自动按Category的name字母排序 category = models.ForeignKey(Category, on_delete=models.CASCADE)
这样设置后,不管你在Django admin里选分类,还是在前端表单里选,选项都会默认按字母顺序排列,一劳永逸。
方法二:在forms.py中针对特定表单设置排序
如果你不想改变模型的全局排序规则,只是想在某个特定表单里让ForeignKey选项按字母排序,那就在表单类里重写该字段的queryset:
# forms.py from django import forms from .models import Post, Category class PostForm(forms.ModelForm): class Meta: model = Post fields = ['title', 'category'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 手动指定category的查询集按name升序排序 self.fields['category'].queryset = Category.objects.order_by('name')
要是你需要降序(Z-A)排列,只需要把order_by('name')改成order_by('-name')就行,加个负号就反转排序方向啦。
小提示
如果同时用了两种方法,表单里的设置会覆盖模型的默认排序,因为表单的queryset优先级更高哦~
内容的提问来源于stack exchange,提问作者Ro0t
相关产品推荐
相关产品推荐

