在 Django 中向 FlatPage 模型添加管理器

Add a manager to FlatPage model in Django

提问人:HBMCS 提问时间:6/16/2020 最后编辑:HBMCS 更新时间:12/31/2020 访问量:95

问:

我想在 Django 中扩展 FlatPage 模型,以便我可以在其字段中实现搜索。这就是我所做的:

models.py:

from django.db.models import Q
from django.contrib.flatpages.models import FlatPage

class FlatPageManager(models.Manager):
    def search(self, query=None):
        qs = self.get_queryset()
        if query is not None:
            or_lookup = (Q(title__icontains=query) |
                        Q(content__icontains=query)
                        )
            qs = qs.filter(or_lookup).distinct()
        return qs

class MyFlatPage(FlatPage):

    objects = FlatPageManager()

views.py:

class SearchView(ListView):
   [...]
    def get_context_data(self, *args, **kwargs):

        context['query'] = self.request.GET.get('q')
        return context

    def get_queryset(self):
        request = self.request
        query = request.GET.get('q', None)

        if query is not None:
            flatpage_results     = MyFlatPage.objects.search(query)


            qs = sorted(queryset_chain,
                        key=lambda instance: instance.pk,
                        reverse=True)
            return qs

上面的搜索方法适用于我拥有的其他模型,因此它也应该适用于 MyFlatPage。尽管如此,我没有得到该查询的结果。我错过了什么吗?

更新 1

空的是整个 MyFlatPage 列表:

>>> MyFlatPage.objects.all()
<QuerySet []>
django django 模型 视图 django 简单页面

评论

0赞 ncopiy 6/16/2020
我理解正确吗:你的 api 中没有结果?你有一个空列表吗?
0赞 HBMCS 6/16/2020
@ncopiy我得到一个空列表:(肯定有带有“the”的内容)。实际上我也得到了一个空的 objects.all 列表: ,所以问题出在 MyFlatPage 类上。>>> MyFlatPage.objects.search('the') <QuerySet []>>>> MyFlatPage.objects.all() <QuerySet []>
0赞 ncopiy 6/16/2020
好的,我有三个版本。1) 也许 DB 中什么都没有,你能单独检查一下你的过滤吗?2) - 也许用(我知道有同义词,但也许)3)你可以用方法用法替换。orrequest.GET.get('q', None)request.query_paramssortedqs = qs.order_by("-id")
1赞 ncopiy 6/16/2020
这要视情况而定。如果已定义为代理模型,则数据库中的表将与 for 相同。如果你没有定义,那么你有另一个表,所有单位都不在表中。在这里查看: docs.djangoproject.com/en/3.0/topics/db/models/#proxy-modelsMyFlatPageFlatModelMyFlatModelproxy = TrueMetaFlatModelMyFlatModel
1赞 HBMCS 6/16/2020
点对点。从我的代码中可以看出,我缺少 in .如果你写出答案,我会接受的。proxy=TrueMeta

答:

0赞 ncopiy 6/16/2020 #1

django 模型继承有两种常见的类型:代理模型和新模型。

如果要将表用作新模型的表,则必须通过在以下位置添加标志来定义为代理表:FlatPageMyFlatPageMyFlatPageproxy = TrueMeta

class MyFlatPage(FlatPage):
    class Meta:
        proxy = True

在其他情况下,您将有另一个表 。MyFlatPage