python - Django: searching in related models
问题描述
Hello I want to create simple search form which will allow to get data from related models.
I have 3 models:
class Person(models.Model):
name = models.CharField()
surname = models.CharField()
class Phone(models.Model):
person = models.ForeignKey(Person,on_delete=models.CASCADE,related_name="phones")
phone = models.CharField(0
class Email(models.Model):
person = models.ForeignKey(Person,on_delete=models.CASCADE, related_name="emails")
email = models.EmailField()
in my home view I have:
def home(request):
people = Person.objects.all()
query = request.GET.get("q")
if query:
people = Person.objects.filter(Q(name__icontains=query)|Q(surname__icontains=query)|
Q(emails__contains=query)|Q(phones__icontains=query))
//when I try emails_email__icontains=query I get error about no such fields
return render(request,'app/home.html',{'users': people})
And it works fine, but I would like to search throug emails and phones too (person can have fews email and phone). If in my query I use another OR (|), I got error I cant combine 2 models in one query. I also wanto to try with chain:
people= above query
emails = Email.objects.filter(email__icontains=query)
context = chain(people,emails)
Unfortunately, this solution doesnt work too. How can I solve this?
EDIT: TEMPLATE
{% block content %}
{%for user in users %}
{{user.id }} {{user.name}} {{user.surname}}
{% for email in user.email_set.all %}
{{email}}
{% endfor %}
{% endfor %}
解决方案
you can use Q
here:
models:
class Phone(models.Model):
person = models.ForeignKey(Person,on_delete=models.CASCADE, related_name="phones")
phone = models.CharField(0
class Email(models.Model):
person = models.ForeignKey(Person,on_delete=models.CASCADE, related_name="emails")
email = models.EmailField()
views:
from django.db.models import Q
def home(request):
people= Person.objects.all()
query - request.GET.get("q")
if query:
people = Person.objects.filter(Q(name__icontains=query) | Q(surname__icontains=query) | Q(emails__email__icontains=query) | Q(phones__phone__icontains=query))
return render(request,'app/home.html',{'users': people})
推荐阅读
- python - 如何使用python将文件从一个目录复制到另一个扩展名为XLSB的目录而不读取文件
- c++ - 警告:格式“%u”需要“unsigned int”类型的参数,但参数 2 的类型为“int*”[-Wformat=]
- python - 如何在python的下一列中写入csv文件
- sql-server - 视图(链接服务器)和目标表之间的选择/合并在哪里执行?
- reactjs - 如何显示一个
- http - 如果用户在 POST 登录请求中缺少用户名或密码,我应该使用什么状态码?
- ruby - 在 ActiveMQ 中使用 stomp 从消费者端实施重新交付策略
- jupyter-lab - 如何更改 Jupyterlab 侧边栏的位置
- visual-studio - 在 VS2013 (libcaffe) 中安装 caffe 时出现错误 MSB3073
- c++ - 使用函数验证字符串和整数是否为回文(C++)