Django只返回一个特定字段而不是整个模型

时间:2014-08-18 10:07:03

标签: python django django-views django-haystack

我是Django的新手。我尝试编写一个视图,返回与搜索词相关联的外键模型的字段。而不是整个模型(外键),我只得到一个特定的领域。

这是有问题的视图:

@csrf_exempt
@requires_csrf_token
def search_haystack(request):
    if request.method == 'POST':
        search_text = request.POST['search']
        print search_text
    else:
        search_text = ''
    results_list= None

    if str(search_text) != "":
        results_dish = SearchQuerySet().models(dish).filter(content=AutoQuery(request.POST.get("search", "")))
            for result in results_dish:
                print result.resto
                print result.resto.name
                print result.resto.area
            results_list = [{'resto_id':result.resto.id , 'name' :result.resto.name, 'area' :result.resto.area} for result in results_dish]
    else:
        results = None
    print results_list
    print encodeToJsonHaystack(results_list)
    return HttpResponse(encodeToJsonHaystack(results_list), mimetype = "application/json")

模型:

class resto(models.Model):
    id = models.AutoField("id", max_length=100, unique=True, primary_key=True)
    area=models.CharField("area", max_length = 100,blank = True, null=True)
    name = models.CharField("name", max_length = 100,blank = True, null=True)
    class Meta:
        db_table=u'resto'

    def __unicode__ (self):
        return self.name


class dish(models.Model):
    id = models.AutoField("id", max_length=100, unique=True, primary_key=True)
    resto= models.ForeignKey(resto)
    name = models.CharField("name", max_length = 50,blank = True, null=True)
    class Meta:
        db_table=u'dish'

    def __unicode__ (self):
        return self.name

该行" print result.resto"打印resto的名称。

print result.resto.name并打印result.resto.area不会打印任何内容。

为什么?我需要做些什么才能获得resto的所有字段?

search_indexes.py

import datetime
from haystack import indexes
from litchee.models import resto
from litchee.models import dish


class restoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')
    area = indexes.CharField(model_attr='area')

    def get_model(self):
         return resto

    def index_queryset(self, using=None):
    """Used when the entire index for model is updated."""
        return self.get_model().objects.all()


class dishIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')
    resto = indexes.CharField(model_attr='resto')

    def get_model(self):
        return dish

    def index_queryset(self, using=None):
    """Used when the entire index for model is updated."""
        return self.get_model().objects.all() #Add support for Is Shutdown

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,你不是在查询Django模型,而是通过Haystack查询搜索引擎。你得到的回答不是模型的一个实例,但是。在Dish模型的搜索索引中,resto是CharField,这自然是您在搜索结果中获得的内容,而不是对其他模型的引用。

您应该能够通过object attribute访问每个结果的实际Django模型实例,然后您可以按照外键访问。

请注意,如果您对Django完全不熟悉,那么在您正确理解实际模型API的工作原理之前,您可能暂时忘记了Haystack。你可能根本不需要它。