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
相关产品推荐
相关产品推荐

