簡體   English   中英

Django:在相關模型中搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM