简体   繁体   English

Django:在相关模型中搜索

[英]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: 我有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()

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. 如果在查询中使用另一个OR(|),则出现错误,我无法在一个查询中合并2个模型。 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 %}

try this 尝试这个

in models.py 在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()

in filter 在过滤器中

from django.db.models import Q

people = Person.objects.filter(Q(name__icontains=query)|Q(surname__icontains=query)|Q(b__email__icontains=query))

in template 在模板中

{% block content %}
{% for user in users %}
    {{user.id }} {{user.name}} {{user.surname}}
    {% for email in user.b.all %}
       {{email.email}}
    {% endfor %}
{% endfor %}

hope it helps 希望能帮助到你

you can use Q here : 您可以在这里使用Q

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})

use chain 使用链

To what I understand of the question, you basically need a union of people having the search query either as an email or as a phone. 就我对这个问题的理解而言,您基本上需要一群人将搜索查​​询作为电子邮件或电话进行。

    Person.objects.filter(Q(mobile__icontains=query)|Q(email__icontains=query))

The above query will return the list of Person objects as a result. 上面的查询将返回Person对象的列表作为结果。 This is basically a reverse lookup which will search all models having Person as a foreign key and having fields namely mobile and email. 这基本上是一种反向查找,它将搜索所有以Person为外键并具有字段(即手机和电子邮件)的模型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM