Django 2.0.3内联Admin:如何在PriceInlineAdmin查询集中排除blue颜色?
在Django 2.0.3内联模型中过滤外键QuerySet
这问题我熟,在Django Admin的内联模型里过滤外键查询集,直接重写formfield_for_foreignkey方法就搞定了,刚好适配你用的Django 2.0.3版本。
具体实现步骤
先假设你的模型结构大概是这样(如果和实际有出入,调整字段名即可):
# models.py from django.db import models class Color(models.Model): name = models.CharField(max_length=50) def __str__(self): return self.name class Product(models.Model): name = models.CharField(max_length=100) class Price(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) color = models.ForeignKey(Color, on_delete=models.CASCADE) amount = models.DecimalField(max_digits=10, decimal_places=2)
接下来在admin.py中修改PriceInlineAdmin,重写钩子方法过滤颜色选项:
# admin.py from django.contrib import admin from .models import Product, Price, Color class PriceInlineAdmin(admin.TabularInline): model = Price def formfield_for_foreignkey(self, db_field, request, **kwargs): # 只针对color外键字段做过滤处理 if db_field.name == "color": # 排除名称为blue的颜色,用__iexact可忽略大小写,严格匹配就换成name="blue" kwargs["queryset"] = Color.objects.exclude(name__iexact="blue") # 调用父类方法保证其他外键字段的默认行为不受影响 return super().formfield_for_foreignkey(db_field, request, **kwargs) @admin.register(Product) class ProductAdmin(admin.ModelAdmin): inlines = [PriceInlineAdmin]
核心逻辑说明
formfield_for_foreignkey是Django Admin专门提供的钩子,用来自定义外键字段的可选数据集,在你用的2.0.3版本里完全兼容。- 先判断字段是否为
color,避免修改其他外键的默认查询集。 exclude(name__iexact="blue")会排除所有名称(不区分大小写)为blue的颜色,如果你需要严格区分大小写,直接写exclude(name="blue")就行。
内容的提问来源于stack exchange,提问作者koddr
相关产品推荐
相关产品推荐

