[英]Django: searching in related models
您好,我想创建一个简单的搜索表单,该表单将允许从相关模型中获取数据。
我有3种型号:
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()
在主视图中,我有:
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})
它工作正常,但我也想搜索电子邮件和电话(人可能很少有电子邮件和电话)。 如果在查询中使用另一个OR(|),则出现错误,我无法在一个查询中合并2个模型。 我也想尝试使用链:
people= above query
emails = Email.objects.filter(email__icontains=query)
context = chain(people,emails)
不幸的是,该解决方案也不起作用。 我该如何解决?
编辑:模板
{% block content %}
{%for user in users %}
{{user.id }} {{user.name}} {{user.surname}}
{% for email in user.email_set.all %}
{{email}}
{% endfor %}
{% endfor %}
尝试这个
在models.py中
class Person(models.Model):
name = models.CharField()
surname = models.CharField()
class Phone(models.Model):
person = models.ForeignKey(Person,on_delete=models.CASCADE, related_name='a')
phone = models.CharField(0
class Email(models.Model):
person = models.ForeignKey(Person,on_delete=models.CASCADE, related_name='b')
email = models.EmailField()
在过滤器中
from django.db.models import Q
people = Person.objects.filter(Q(name__icontains=query)|Q(surname__icontains=query)|Q(b__email__icontains=query))
在模板中
{% block content %}
{% for user in users %}
{{user.id }} {{user.name}} {{user.surname}}
{% for email in user.b.all %}
{{email.email}}
{% endfor %}
{% endfor %}
希望能帮助到你
您可以在这里使用Q
:
楷模:
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()
意见:
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})
就我对这个问题的理解而言,您基本上需要一群人将搜索查询作为电子邮件或电话进行。
Person.objects.filter(Q(mobile__icontains=query)|Q(email__icontains=query))
上面的查询将返回Person对象的列表作为结果。 这基本上是一种反向查找,它将搜索所有以Person为外键并具有字段(即手机和电子邮件)的模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.