Django添加GenericForeignKey搜索字段

2024-06-01 01:10:52 发布

您现在位置:Python中文网/ 问答频道 /正文

Django 1.8.4添加GenericForeignKey搜索字段不起作用。在

我创建了几个产品模型,例如:

class Product1(models.Model):
    ...
    orders = GenericRelation(Order)

class Product2(models.Model):
    ...
    orders = GenericRelation(Order)

在订单模型中:

^{pr2}$

这一切都很好

但当我想在OrderAdmin中搜索Produt name时,我添加了prodct\uu name搜索字段,如下所示:

class OrderAdmin(admin.ModelAdmin):
    ...
    search_fields = [
        'product__name',
    ]

这样不行!在

Django提出:

Field 'product' does not generate an automatic reverse relation and therefore cannot be used for reverse querying. 
If it is a GenericForeignKey, consider adding a GenericRelation.

不明白django1.8genericforeignkey是如何工作的,genericrations已经存在于产品模型中,但仍然不起作用。在


Tags: djangoname模型model产品modelsorderproduct
1条回答
网友
1楼 · 发布于 2024-06-01 01:10:52

通过重写默认的get_search_results方法,下面的代码通常可以工作,但是仍然有一个小问题。在

def get_search_results(self, request, queryset, search_term):
    """Override to Include searching `product__name` which is a
     GenericForeignKey Field of all product types.
     Returns a tuple containing a queryset to implement the search,
     and a boolean indicating if the results may contain duplicates.
    """
    products = [v for k, v in pro_models.PRODUCT_DICT.iteritems()]
    generic_queryset = queryset

    product_list = list()
    for bit in search_term.split():
        for product in products:
            product_queryset = product.objects.filter(
                Q(name__icontains=bit))
            product_list += list(product_queryset)

        generic_query = [Q(**{
            'content_type': ContentType.objects.get_for_model(product),
            'object_id': product.id
        }) for product in product_list]

        if generic_query:
            generic_queryset = generic_queryset.filter(
                reduce(operator.or_, generic_query))
        else:
            generic_queryset = generic_queryset.none()

    default_queryset, use_distinct = \
        super(OrderAdmin, self).get_search_results(
            request,
            queryset,
            search_term
        )
    return default_queryset | generic_queryset, use_distinct

相关问题 更多 >