python - Django:在多个模型中搜索
问题描述
我想在 django 中实现多模型搜索,这意味着我想在两个模型中搜索不同的字段。
我的两个模型是“故事”和“地方”:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from places.models import Place
from django.urls import reverse
class Story (models.Model):
title = models.CharField(max_length=100,blank=False)
content = models.TextField(blank=False)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
Place = models.ForeignKey(Place, on_delete=models.PROTECT)
audio = models.FileField(default='SOME STRING', upload_to='audio_stories/',blank=False)
class Place (models.Model):
name = models.CharField(max_length=100, blank=False)
country = models.ForeignKey(Country, on_delete=models.PROTECT, null=True)
city = models.ForeignKey(City, on_delete=models.PROTECT, null=True)
description = models.TextField(blank=False)
location_image = models.ImageField(default='default.jpg', upload_to='location_pics/', blank=False)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('place-detail', kwargs={'pk': self.pk})
def save(self):
super().save()
img = Image.open(self.location_image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.location_image.path)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('story-detail', kwargs={'pk': self.pk})
我的视图合并了两个查询。
from django.shortcuts import render, get_object_or_404, redirect
from django.db.models import Q
from django.views.generic import (ListView)
from django.contrib.auth.models import User
from places.models import Place
from .models import Story
class SearchResultsView(ListView):#
template_name = 'story/results.html'
def get_queryset(self):
request = self.request
query = request.GET.get('q', None)
if query is not None:
story_list = Story.objects.filter(Q(title__icontains=query))
place_list = Place.objects.filter(Q(name__icontains=query))
results = chain(story_list, place_list)
return results
最后我在模板中显示搜索:
{% extends "story/base.html" %}
{% block content %}
{% load static %}
<form class="form-inline my-2 my-lg-0" method="get">
<input name="q" class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
<h1>Search Results Stories</h1>
<div class="row">
<div class="col-md-8 narrow ">
{% for story in object_list %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{ story.author.profile.image.url }}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'user-stories' story.author.username %}">{{ story.author }}</a>
<small class="text-muted">{{ story.date_posted|date:"F d, Y" }}</small>
</div>
<h2><a class="article-title" href="{% url 'story-detail' story.id %}">{{ story.title }}</a></h2>
<p class="article-content">{{ story.content }}</p>
<audio
controls
src="{{ story.audio.url }}">
Your browser does not support the
<code>audio</code> element.
</audio>
<small class="text-muted">{{ story.Place }}, {{ story.Place.city }}</small>
</div>
</article>
{% endfor %}
<h1>Search Results Places</h1>
{% for place in place %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{place.location_image.url}}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2">{{ place.city }}</a>
<small class="text-muted">Germany</small>
</div>
<h2><a class="article-title" href="{% url 'place-detail' place.id %}">{{ place.name }}</a></h2>
<p class="article-content">{{ place.description }}</p>
</div>
</article>
{% endfor %}
</div>
</div>
{% endblock content%}
当我输入“Town”时,我应该得到:
故事模型(标题)中的“故事标题小镇故事标题”
来自地方模型(名称)的“地名城镇地名”
不知何故,只有“标题”模型中的搜索有效,但“地点”中的搜索结果不显示。
解决方案
推荐阅读
- go - 如何在我的 CLI 中获取用户选择的标志
- python - 构建具有不同扩展名选择的文件路径
- laravel - 修改供应商文件,Laravel
- python - 如何在不覆盖列值的情况下连接数据帧
- python - 如何使用交易机器人同时监控多个资产?
- java - 来自前端的第三方的 Rest API 请求设计
- docusignapi - DocuSign API 设置签名者语言不适用于第一个签名者
- ibm-doors - 使用 IBM DOORS 并需要 DXL 脚本将段落 ID 添加到链接
- python - MD5 Hash Cracker -- Unicode 对象必须在散列之前进行编码
- bash - curl pull request 错误 - fork_collab Fork collab 不能由未经许可的人授予