Джанго: поиск в похожих моделях - PullRequest
1 голос
/ 12 июня 2019

Здравствуйте. Я хочу создать простую форму поиска, которая позволит получать данные из связанных моделей.

У меня есть 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})

И это прекрасно работает, но я бы тоже хотел поискать через электронную почту и телефоны (у человека может быть мало электронной почты и телефона).Если в моем запросе я использую другое ИЛИ (|), я получил ошибку, я не могу объединить 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 %}

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

попробуйте

в 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 %}

надеюсь, это поможет

1 голос
/ 12 июня 2019

Насколько я понимаю, вопрос, по сути, вам нужен союз людей, имеющих поисковый запрос в виде электронной почты или телефона.

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

Приведенный выше запрос вернет список объектов Person в результате. Это в основном обратный поиск, который будет искать все модели, имеющие Person в качестве внешнего ключа и имеющие поля, а именно mobile и email.

1 голос
/ 12 июня 2019

Вы можете использовать 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})

использовать цепочку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...