Написание фильтрации по запросу для связанных объектов
Предположим, что у нас есть следующие модели
class Category(models.Model):
name = models.CharField(max_length=254)
class Item(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="categories")
name = models.CharField(max_length=254)
state = models.ForeignKey(State, on_delete=models.CASCADE)
Категории и их элементы перечислены следующим образом
def view(request):
categories = Category.objects.all()
pass
{% for category in categories %}
{{ category.name }}
{% for item in category.items.all %}
{{ item.name }}
{% endfor %}
{% endfor %}
В этой структуре я хочу написать фильтрацию по запросу для перечисленных "элементов".
def view(request):
...
queryset = ???
state = request.GET.get('state')
if state:
queryset = queryset.filter(state__name=state)
Проблема заключается в определении 'queryset'. Потому что, Items перечислены как связанные объекты категории.
Можно ли это сделать правильно? Или мне нужно изменить дизайн?
Ваш related_name
в объекте Item для поля category должен иметь имя "items". Тогда category.items.all выдаст вам список элементов этой категории. Посмотрите пример в документации.
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags",
)
name = models.CharField(max_length=255)