具有模型属性的 Django 管理 search_fields

问题描述 投票:0回答:2

我正在尝试使用模型中的属性作为 django admin (1.2) 中的字段。

这是我的代码示例:

class Case(models.Model):
    reference = models.CharField(_(u'Reference'), max_length=70)
    client_read = models.BooleanField(default=0)

    def __unicode__(self):
        return self.case_id

    @property
    def case_id(self):
        """ unique case ID """
        number = (settings.CASE_ID_LENGTH - len(str(self.id))) * "0" + str(self.id)
        return '%(year)s%(unique_id)s' % { 
            'year': self.case_date.strftime("%y"),
            'month': self.case_date.strftime("%m"),
            'unique_id': number}

以及admin.py的部分:

class OrderAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
    [...]
    search_fields = ('id','case','req_surname','req_forename','req_company')

我可以将该字段称为“case”(如示例中所示),但这给了我一个TypeError:相关字段具有无效的查找:icontains

当然,它与相关字段一起工作:所以我可以使用 case__id 然后我可以使用 id 作为搜索查询。 但这对用户来说有点恼火,因为 caseid 显示不同。

有没有办法像显示的那样使用 case_id 作为搜索查询(年+月+id)?

django django-admin
2个回答
5
投票

不,你不能那样使用它,因为这只适用于表示数据库中列的属性,而不适用于属性。实现这项工作的唯一方法是使用

contrib.admin.views.main.ChangeList
的子类作为更改列表,并覆盖它的
get_query_set
方法以实现所需的行为!


0
投票

,不,你不能直接使用,必须这样使用:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.db.models import Q
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelSearchView(APIView):
    def get(self, request, *args, **kwargs):
        search_query = request.query_params.get('search', '')
        if search_query:
            queryset = YourModel.objects.filter(
                Q(name__icontains=search_query) | Q(description__icontains=search_query)
            )
        else:
            queryset = YourModel.objects.all()

        serializer = YourModelSerializer(queryset, many=True)
        return Response(serializer.data)
© www.soinside.com 2019 - 2024. All rights reserved.