You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:02:34