Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django和Haystack搜索问题_Python_Django Haystack - Fatal编程技术网

Python Django和Haystack搜索问题

Python Django和Haystack搜索问题,python,django-haystack,Python,Django Haystack,我正在运行Python2.6,这是最新的haystack,django 1.2测试版,我已经尝试了Woosh和Xapian后端 问题是,我不能对整型字段执行u lt或u gt筛选-当使用这种方法时,总是找不到任何结果 我的模型: # -*- coding: utf-8 -*- from django.db import models from django.utils.translation import ugettext as _ from django.forms import Model

我正在运行Python2.6,这是最新的haystack,django 1.2测试版,我已经尝试了Woosh和Xapian后端

问题是,我不能对整型字段执行u lt或u gt筛选-当使用这种方法时,总是找不到任何结果

我的模型:

# -*- coding: utf-8 -*-

from django.db import models
from django.utils.translation import ugettext as _
from django.forms import ModelForm
from django.contrib.auth.models import User

# Create your models here.

class District(models.Model):
    name = models.CharField(_('STRING_DISTRICT'),max_length=100)
    def __unicode__(self):
        return u'%s' % self.name

class City(models.Model):
    district = models.ForeignKey(District)
    name = models.CharField(_('STRING_CITY'),max_length=100)
    def __unicode__(self):
        return u'%s -> %s' % (self.district.name,self.name)

class Status(models.Model):
    name = models.CharField(_('STATUS_NAME'),max_length=50)
    def __unicode__(self):
        return u'%s' % self.name

class Source(models.Model):
    name = models.CharField(_('SOURCE_NAME'),max_length=50)
    def __unicode__(self):
        return u'%s' % self.name

class SpaceUnit(models.Model):
    name = models.CharField(_('SPACE_UNIT_NAME'),max_length=50)
    def __unicode__(self):
        return u'%s' % self.name

class Currency(models.Model):
    name = models.CharField(_('CURRENCY_NAME'),max_length=50)
    def __unicode__(self):
        return u'%s' % self.name

class EstateType(models.Model):
    name = models.CharField(_('ESTATE_TYPE'),max_length=50)
    def __unicode__(self):
        return u'%s' % self.name

class Client(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(_('STRING_NAME'),max_length=50)
    surname = models.CharField(_('STRING_SURNAME'),max_length=50)
    code = models.CharField(_('STRING_PID_REG_NR'),max_length=50,blank=True)
    status = models.ForeignKey(Status,blank=True)
    source = models.ForeignKey(Source,blank=True)
    district = models.ForeignKey(District)
    city = models.ForeignKey(City)
    mobile_phone = models.CharField(_('STRING_MOBILE_PHONE_PERSONAL'),max_length=15,blank=True)
    home_phone = models.CharField(_('STRING_HOME_PHONE'),max_length=15,blank=True)
    work_phone = models.CharField(_('STRING_WORK_PHONE'),max_length=15,blank=True)
    work_mobile_phone = models.CharField(_('STRING_WORK_MOBILE_PHONE'),max_length=15,blank=True)
    agreement_nr = models.CharField(_('STRING_AGREEMENT_NR'),max_length=50,blank=True)
    email_private = models.CharField(_('STRING_EMAIL_PRIVATE'),max_length=100,blank=True)
    estate_type = models.ForeignKey(EstateType)
    wants_to_rent = models.BooleanField(_('STRING_WANTS_TO_RENT'),blank=True)
    rental_space_from = models.IntegerField(_('STRING_SPACE_FROM'),max_length=5)
    rental_space_until = models.IntegerField(_('STRING_SPACE_UNTIL'),max_length=5)
    rental_space_units = models.ForeignKey(SpaceUnit,related_name="rental_space_units")
    rental_price_from = models.IntegerField(_('STRING_PRICE_FROM'),max_length=5)
    rental_price_until = models.IntegerField(_('STRING_PRICE_UNTIL'),max_length=5)
    rental_price_units = models.ForeignKey(Currency,related_name="rental_currency_units")
    wants_to_buy = models.BooleanField(_('STRING_WANTS_TO_BUY'),blank=True)
    buying_space_from = models.IntegerField(_('STRING_SPACE_FROM'),max_length=5)
    buying_space_until = models.IntegerField(_('STRING_SPACE_UNTIL'),max_length=5)
    buying_space_units = models.ForeignKey(SpaceUnit,related_name="buying_space_units")
    buying_price_from = models.IntegerField(_('STRING_PRICE_FROM'),max_length=5)
    buying_price_until = models.IntegerField(_('STRING_PRICE_UNTIL'),max_length=5)
    buying_price_units = models.ForeignKey(Currency,related_name="buying_currency_units")
    def __unicode__(self):
        return u'%s %s' % (self.name,self.surname)
class ClientForm(ModelForm):
    class Meta:
        model = Client
search_index.py

from haystack.indexes import *
from haystack import site
from clients.models import Client

class ClientIndex(RealTimeSearchIndex):
    text = CharField(document=True, use_template=True)
    wants_to_rent = BooleanField(model_attr='wants_to_rent')
    rental_space_from = CharField(model_attr='rental_space_from')
    rental_space_until = CharField(model_attr='rental_space_until')
    rental_price_from = CharField(model_attr='rental_space_from')
    rental_price_until = CharField(model_attr='rental_space_until')
    wants_to_buy = BooleanField(model_attr='wants_to_buy')
    buying_space_from = CharField(model_attr='buying_space_from')
    buying_space_until = CharField(model_attr='buying_space_until')
    def prepare_rental_space_from(self, obj):
        return '%08d' % obj.rental_space_from
    def prepare_rental_space_until(self, obj):
        return '%08d' % obj.rental_space_until
    def prepare_rental_price_from(self, obj):
        return '%08d' % obj.rental_price_from
    def prepare_rental_price_until(self, obj):
        return '%08d' % obj.rental_price_until 
site.register(Client, ClientIndex)
并搜索_form.py

from django import forms
from haystack.forms import SearchForm
from haystack.query import SearchQuerySet
from django.utils.translation import ugettext as _

class ClientSearchForm(SearchForm):
    """start_date = forms.DateField(required=False)
    end_date = forms.DateField(required=False)"""

    wants_to_rent = forms.BooleanField(required=False)
    rental_space_from = forms.IntegerField(label=_('STRING_SPACE_FROM'),required=False)
    rental_space_until = forms.IntegerField(label=_('STRING_SPACE_UNTIL'),required=False)
    rental_price_from = forms.IntegerField(label=_('STRING_PRICE_FROM'),required=False)
    rental_price_until = forms.IntegerField(label=_('STRING_PRICE_UNTIL'),required=False)
    wants_to_buy = forms.BooleanField(label=_('STRING_WANTS_TO_BUY'),required=False)
    buying_space_from = forms.IntegerField(label=_('STRING_SPACE_FROM'),required=False)
    buying_space_until = forms.IntegerField(label=_('STRING_SPACE_UNTIL'),required=False)
    buying_price_from = forms.IntegerField(label=_('STRING_PRICE_FROM'),required=False)
    buying_price_until = forms.IntegerField(label=_('STRING_PRICE_UNTIL'),required=False)

    def search(self):
        # First, store the SearchQuerySet received from other processing.
        sqs = super(ClientSearchForm, self).search()

        # Check to see if a start_date was chosen.
        """
        if self.cleaned_data['start_date']:
            sqs = sqs.filter(pub_date__gte=self.cleaned_data['start_date'])

        # Check to see if an end_date was chosen.
        if self.cleaned_data['end_date']:
            sqs = sqs.filter(pub_date__lte=self.cleaned_data['end_date'])
        """
        if self.cleaned_data['wants_to_rent']:
            sqs = sqs.filter(wants_to_rent=True)
            if self.cleaned_data['rental_space_from']:
                sqs = sqs.filter(rental_space_from__gte=self.cleaned_data['rental_space_from'])
            if self.cleaned_data['rental_space_until']:
                sqs = sqs.filter(rental_space_until__lt=self.cleaned_data['rental_space_until'])
            if self.cleaned_data['rental_price_from']:
                sqs = sqs.filter(rental_price_from__gte=self.cleaned_data['rental_price_from'])
            if self.cleaned_data['rental_price_until']:
                sqs = sqs.filter(rental_price_until__lte=self.cleaned_data['rental_price_until'])

        if self.cleaned_data['wants_to_buy']:
            sqs = sqs.filter(wants_to_buy=True)
            if self.cleaned_data['buying_space_from']:
                sqs = sqs.filter(buying_space_from__gt=1)
            if self.cleaned_data['buying_space_until']:
                sqs = sqs.filter(buying_space_until__lt=6)
            if self.cleaned_data['buying_price_from']:
                sqs = sqs.filter(buying_price_from__gte=self.cleaned_data['buying_price_from'])
            if self.cleaned_data['buying_price_until']:
                sqs = sqs.filter(buying_price_until__lte=self.cleaned_data['buying_price_until'])

        return sqs

我什么都试过了——零填充整数,无数次重置我的应用程序,但我仍然没有得到任何运气!忽略的字段是从/直到购买空间从/直到,租赁字段也是如此-似乎没有任何影响,如果使用任何筛选器-结果为0。。。谢谢你的建议

我没有一个真正的答案,但下面是我如何寻找答案的:

在搜索方法结束之前,尝试记录/打印您在这里实际构建的查询sqs。它可能会给你一些关于什么是错误的线索

尝试在shell中运行相同类型的查询和相同的筛选器集。您得到了什么结果?

当您可以使用IntegerField时,为什么要对ClientIndex使用CharField


另外,如果您对保存在CharField中的整数进行零填充,请确保您也对搜索值进行零填充。

当使用常用过滤器从shell运行时,一切都很好,当尝试使用Haystack执行某项操作时,会出现问题:在返回之前添加print sqs,并让我们知道它打印的内容。也许它会给出一些方向。如果我这样做,它会返回[]-0个结果,什么也找不到对不起,我是说print sqs.query