Запрос с несколькими внешними ключами (django)
Я делаю панель поиска для сайта, над которым работаю, и у меня возникают проблемы, когда я хочу фильтровать различные поля из разных моделей (связанных между собой) Вот мои модели:
class Project(models.Model):
name = models.CharField(max_length=250)
objective = models.CharField(max_length=250)
description = models.TextField()
launching = models.CharField(max_length=100, null=True, blank=True)
image = models.ImageField(
upload_to='imgs/', null=True, blank=True)
image_thumbnail = models.ImageField(
upload_to='thumbnails/', null=True, blank=True)
slug = models.CharField(max_length=250)
class Meta:
db_table = 'project'
def __str__(self):
return self.name
class Institution(models.Model):
name = models.CharField(max_length=250)
project = models.ManyToManyField(Proyecto)
class Meta:
db_table = 'institution'
def __str__(self):
return self.name
И я хочу иметь возможность искать по названию проекта или учреждения, но мой код принимает только название учреждения.
def searchbar(request):
if request.method == 'GET':
search = request.GET.get('search')
post = Project.objects.all().filter(name__icontains=search, institution__name__icontains=search)
return render(request, 'searchbar.html', {'post': post, 'search': search})
Как я могу найти все проекты, которые совпадают по названию ИЛИ названию учреждения?
BTW, я использую SQL, не уверен, что это имеет значение, но я подумал, что должен добавить эту информацию.
You can .filter(…) [Django-doc] with Q objects [Django-doc]:
from django.db.models import Q
Project.objects.filter(Q(name__icontains=search) | Q(institution__name__icontains=search))
или вы можете работать с параметром _connector:
from django.db.models import Q
Project.objects.filter(
name__icontains=search,
institution__name__icontains=search,
_connector=Q.OR
)