Django Admin外键字段搜索功能失效问题求助
Django Admin关联模型字段搜索问题
我正在构建一个Django项目,想要在FordonsServiceAdmin中添加针对关联模型Fordonsregister的regnr字段的搜索栏,但搜索时出现错误。尝试过search_fields = [foreignkey__name]、[name_id]、[name]等写法,都没能解决问题。相关代码如下,问题集中在FordonsServiceAdmin类:
模型代码
from django.db import models # Create your models here. class Fordonsregister(models.Model): regnr = models.CharField(max_length=6, primary_key=True, null=False, blank=False) namn = models.CharField(max_length=255, null=True, blank=True) tel = models.CharField(max_length=255, default='070-000 00 00', null=True, blank=True) email = models.EmailField(null=True, blank=True) kund_sedan = models.DateTimeField(auto_now=True) kund_points = models.IntegerField(default=0) def __str__(self) -> str: return self.regnr class Meta: ordering = ['regnr'] class ServiceTypes(models.Model): typ = models.CharField(max_length=255, primary_key=True, blank=False) pris = models.DecimalField(decimal_places=2, max_digits=6, null=False, blank=False) beskrivning = models.CharField(max_length=255, null=True, blank=True) def __str__(self) -> str: return self.typ class Meta: ordering = ['typ'] class FordonsService(models.Model): regnr = models.ForeignKey(Fordonsregister, on_delete=models.CASCADE) typ = models.ForeignKey(ServiceTypes, on_delete=models.CASCADE) service_datum = models.DateTimeField() bokat_datum = models.DateTimeField(auto_now=True) kommentar = models.CharField(max_length=1000) class Meta: ordering = ['-service_datum']
Admin模块代码
问题出在class FordonsServiceAdmin(admin.ModelAdmin):部分:
from django.contrib import admin from django.db.models import Count from django.utils.html import format_html, urlencode from django.urls import reverse from django.http import HttpRequest from .models import Fordonsregister, ServiceTypes, FordonsService # Register your models here. @admin.register(Fordonsregister) class FordonsregisterAdmin(admin.ModelAdmin): list_display = ['regnr', 'namn', 'tel', 'email', 'antal_bokningar', 'antal_offerter'] search_fields = ['regnr__istartswith'] def antal_bokningar(self, fordonsregister): url = ( reverse('admin:main_fordonsservice_changelist') + '?' + urlencode({ 'fordonregister__regnr': str(fordonsregister.regnr) })) return format_html('<a href="{}">{}</a>', url, fordonsregister.antal_bokningar) def antal_offerter(self, fordonsregister): url = ( reverse('admin:kalkylator_standardoffert_changelist') + '?' + urlencode({ 'fordonsregister__regnr': str(fordonsregister.regnr) })) return format_html('<a href="{}">{}</a>', url, fordonsregister.antal_offerter) def get_queryset(self, request): queryset = super().get_queryset(request) queryset = queryset.annotate(antal_bokningar=Count("fordonsservice__service_datum"), antal_offerter=Count("standardoffert__totalpris")) return queryset @admin.register(FordonsService) class FordonsServiceAdmin(admin.ModelAdmin): list_display = ['regnr', 'typ', 'service_datum', 'bokat_datum', 'regnr_id'] search_fields = ['fordonsregister__regnr_id'] @admin.register(ServiceTypes) class ServiceTypesAdmin(admin.ModelAdmin): list_display = ['typ', 'pris', 'antal_bokat'] def antal_bokat(self, servicetypes): url = ( reverse('admin:main_fordonsservice_changelist') + '?' + urlencode({ 'servicetypes__typ': str(servicetypes.typ) })) return format_html('<a href="{}">{}</a>', url, servicetypes.antal_bokat) def get_queryset(self, request): queryset = super().get_queryset(request) queryset = queryset.annotate(antal_bokat=Count("fordonsservice__service_datum")) return queryset
解决方案
问题出在FordonsServiceAdmin的search_fields配置错误。FordonsService中关联Fordonsregister的外键字段名为regnr,而非fordonsregister,所以正确的搜索字段写法应为:
@admin.register(FordonsService) class FordonsServiceAdmin(admin.ModelAdmin): list_display = ['regnr', 'typ', 'service_datum', 'bokat_datum', 'regnr_id'] # 格式:外键字段名__关联模型的目标字段名 search_fields = ['regnr__regnr']
如果需要不区分大小写的前缀搜索,可改为:
search_fields = ['regnr__regnr__istartswith']
Django跨关联模型搜索的规则是外键字段名__目标模型字段名,这里FordonsService的外键是regnr,对应关联模型Fordonsregister的regnr字段,因此用regnr__regnr即可实现针对该关联字段的搜索。
内容的提问来源于stack exchange,提问作者Steven Meesters
相关产品推荐
相关产品推荐

