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

Django Admin中通过service_id关联两个Model实现关联数据跳转查询

实现方案

1. 调整AdvancedServiceModelAdmin配置

Django Admin的列表页原生支持GET参数筛选,先给AdvancedServiceModelAdmin添加service_id的筛选配置,让后台能识别对应的筛选参数:

@admin.register(AdvancedServiceModel)
class AdvancedServiceModelAdmin(admin.ModelAdmin):
    list_display = ['service_id', 'bmw', 'audi', 'broken_motor', 'broken_body']
    # 新增这行,支持按service_id筛选
    list_filter = ['service_id']

2. 修改ServiceModelAdmin的跳转逻辑

原来的跳转链接没有携带筛选参数,调整advanced_link方法,拼接对应service_id的筛选参数到链接中,同时修正参数类型注解错误:

@admin.register(ServiceModel)
class ServiceModelAdmin(admin.ModelAdmin):
    list_display = ['advanced_link', 'total_cars', 'repaired']

    def advanced_link(self, obj: ServiceModel):
        base_link = reverse("admin:tasks_advancedservicemodel_changelist")
        # 拼接service_id筛选参数,跳转后只会展示对应service_id的所有记录
        link = f"{base_link}?service_id__exact={obj.service_id}"
        return mark_safe(f'<a href="{link}">{escape(obj.service_id)}</a>')

    advanced_link.short_description = 'Service id'
    advanced_link.admin_order_field = 'service_id'

可选优化:修正模型关联关系(推荐)

你当前的模型配置中ServiceModel通过外键关联AdvancedServiceModel,意味着一个ServiceModel只能对应一条AdvancedServiceModel记录,和你描述的「多个Advanced对象同service_id」的一对多场景不符,建议调整外键位置避免数据冗余和不一致:

# models.py 调整后代码
class ServiceModel(models.Model):
    service_id = models.CharField(max_length=150, unique=True) # 设为唯一值作为关联键
    total_cars = models.PositiveIntegerField()
    repaired = models.PositiveIntegerField()

class AdvancedServiceModel(models.Model):
    # 外键放在多的一侧,直接关联ServiceModel的service_id字段
    service = models.ForeignKey(
        ServiceModel, 
        on_delete=models.CASCADE, 
        related_name='advanced_records',
        to_field='service_id'
    )
    bmw = models.PositiveIntegerField()
    audi = models.PositiveIntegerField()
    broken_motor = models.PositiveIntegerField()
    broken_body = models.PositiveIntegerField()

    def __str__(self) -> str:
        return f'{self.service.service_id}'

调整后无需在两个模型中重复存储service_id,关联逻辑更符合Django ORM的设计规范。

内容的提问来源于stack exchange,提问作者CbrRRider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:27:05