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