我是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
答案 0 :(得分:0)
正如我在评论中提到的,你不是在查询Django模型,而是通过Haystack查询搜索引擎。你得到的回答不是模型的一个实例,但是。在Dish模型的搜索索引中,resto
是CharField,这自然是您在搜索结果中获得的内容,而不是对其他模型的引用。
您应该能够通过object
attribute访问每个结果的实际Django模型实例,然后您可以按照外键访问。
请注意,如果您对Django完全不熟悉,那么在您正确理解实际模型API的工作原理之前,您可能暂时忘记了Haystack。你可能根本不需要它。