Фильтр запроса по идентификатору в 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))
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 может быть списком задач; если это так, оставьте его в таком виде, чтобы люди могли лучше представить себе проблему в реальных терминах.
