Использование запроса для сопоставления объекта, а затем получить все объекты, связанные с Foreignkey - PullRequest
2 голосов
/ 26 января 2020

Я пытаюсь создать доску объявлений, где пользователь может искать работу по почтовому индексу. Я разделил информацию о Business на одну модель и Job на другую. Business содержит поля адреса, состояния, номера телефона и т. Д. c, а Job - информацию о самой работе. Я разработал его таким образом, чтобы пользователю не приходилось повторно вводить информацию о физическом бизнесе каждый раз при публикации работы. Однако теперь, когда я пытаюсь запросить Job s, соответствующие введенному почтовому индексу, мне действительно нужно захватить Business объекты, соответствующие этому почтовому индексу, а затем захватить Job объекты, связанные с ними? Вот мой код:

models.py

from django.db import models
from django.contrib.auth.models import User

class Business(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    zip_code = models.CharField(max_length = 10)


class Job(models.Model):
    business = models.ForeignKey(Business, on_delete= models.CASCADE)
    # ... 

views.py:

def search_results(request):
    query =request.GET.get('query') 
    jobs = Job.objects.filter(zipcode = query) # tried this before realizing the `zipcode` field was part of the `Business` model and not the `Job` model.
    return render(request, 'job/search_results.html', { 'jobs': jobs})

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

Ответы [ 3 ]

2 голосов
/ 26 января 2020

Вы хотите получить доступ к Business через модель Job, например, используя __:

jobs = Job.objects.filter(business__zip_code=query)

Дополнительная информация: https://docs.djangoproject.com/en/3.0/topics/db/queries/#lookups -that-span- отношения

1 голос
/ 26 января 2020

Вы можете сопоставить связанные задания с:

def search_results(request):
    query =request.GET.get('query') 
    jobs = Job.objects.filter(<b>business__zipcode=query</b>)
    return render(request, 'job/search_results.html', { 'jobs': jobs})

Можно просмотреть сквозные отношения с помощью двойных подчеркиваний (__).

Если вам нужно показать связанные бизнес Job s, тогда, возможно, стоит выполнить .select_related(..) на модели Business:

def search_results(request):
    query =request.GET.get('query') 
    jobs = Job.objects.filter(business__zipcode=query)<b>.select_related('business')</b>
    return render(request, 'job/search_results.html', { 'jobs': jobs})
0 голосов
/ 26 января 2020

Вы можете запросить через Business FK:

Job.objects.filter(business__zip_code=your_code)

Подробнее здесь .

...