Фильтр запроса по идентификатору в Django

Я знаю, что это обычный вопрос, но я просто запутался, какой лучший способ фильтрации данных из одной таблицы в другую таблицу, дело в том, что я хочу фильтровать name таблицы category1 и category2 через ID на основе изображения, показанного ниже, Это очень полезно для меня, чтобы использовать этот вид реализации.

Вот так же

Select title ,description, category1_tbl.name, category2_tbl.name from main_tbl....... JOIN TWO TABLES 

views.py

task_tbl.objects.get(category1_id=category1_tbl.objects.get(id))

enter image description here

Django управляет объединением таблиц за вас и знает, как это сделать на основе ваших полей ForeignKey.

Если вы хотите фильтровать по значению имени в каждой из таблиц категорий, вы можете использовать предложение "или", используя функцию Q, чтобы сделать более сложный or поиск , подобный следующему. Обратите внимание на использование двойного подчеркивания для перехода к полю name связанной таблицы. В качестве примечания, вы должны начинать каждое слово в именах классов/моделей с верхнего регистра и удалять подчеркивание. Это общепринятый стиль, и в django он устранит путаницу при сканировании ваших запросов.

from django.db.models import Q

name_to_filter = "carl"
main_objs = main_tbl.objects.filter(Q(category1__name=name_to_filter) |
                            Q(category2__name=name_to_filter)) 

Если вам нужно вернуть только записи, в которых имя должно быть и в категории 1, и в категории 2, нет необходимости в предложении or, и вы можете использовать стандартный метод фильтрации, который 'ands' все вместе.

name_to_filter = "carl"
main_objs = main_tbl.objects.filter(category1__name=name_to_filter,
                            category2__name=name_to_filter) 

EDIT. Если вы знаете идентификатор категории, как было предложено в вашем комментарии, вы можете фильтровать по нему. Фильтр создает условия where. В main_tbl есть поле для id в категориях, поэтому вы можете запросить его напрямую, например:

id_to_filter = 7
main_objs = main_tbl.objects.filter(category1_id=id_to_filter) 

или если вы хотите принудительно объединить, вы можете использовать метод двойного подчеркивания (не уверен, зачем это нужно в данном случае)

id_to_filter = 7
main_objs = main_tbl.objects.filter(category1__id=id_to_filter) 

Обратите внимание, что в фильтрах вы используете имя поля в main_tbl, а не фактические имена таблиц, на которые они ссылаются.

Редактирование 2 После обновления вашего вопроса. Я думаю, что вам нужно думать о вещах по-другому. Вам нужно определить или описать, нужен ли вам список имен из одной из этих категорий или вам нужно отобразить их в шаблоне. Если вам нужен JsonResponse, укажите, как должна выглядеть полезная нагрузка Json. Например, если вам нужен плоский список имен в представлении, для этого существуют такие инструменты, как values_list:

names = main_tbl.objects.filter(id=1).values_list(category1__name, flat=True)

Но если вы хотите отображать вещи из main_tbl и категорий, передайте queryset в шаблон. В представлении у вас будет что-то вроде этого. Позвольте Django сделать работу по созданию соединений между таблицами, в этом сила Django ORM.

main_objs = main_tbl.objects.filter(id=1)
context = {'main_objs': main_objs}
return render(request, "your_template.html", context) 

и в your_template.html что-то вроде:

{% for cat1 in main_objs.category1_set.all %}
    {{ cat1.name }}<br />
{% endfor %}

Вам нужно определить, что вы пытаетесь сделать. У меня есть ощущение, что вы пытаетесь упростить ситуацию с помощью имен типа "main_tbl", но вы должны указать в этих сообщениях, что именно вы пытаетесь сделать. Возможно, кто-то может предложить лучший способ достичь того, что вы хотите. Исходя из вашего сообщения, main_tbl может быть списком задач; если это так, оставьте его в таком виде, чтобы люди могли лучше представить себе проблему в реальных терминах.

Вернуться на верх