Написание фильтрации по запросу для связанных объектов

Предположим, что у нас есть следующие модели

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)
Вернуться на верх