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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:47:02