Как я могу фильтровать элементы в DjangoRestFramework?

Я полный новичок и некоторое время назад я сделал проект на django. Его основная цель - добавление ресторанов и категорий и меню еды соответственно. Пока все работает хорошо, если я захожу в нужный ресторан, то он показывает его категории. Но теперь я хочу улучшить его с помощью Vuejs и поэтому пытаюсь сделать Django REST API. Но я не могу фильтровать категории и блюда по их ресторану, потому что модель категории не связана напрямую с моделью ресторана. Мой models.py выглядит следующим образом:

from django.db import models
from django.conf import settings

class Restaurant(models.Model):
    owner = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="restaurant", on_delete=models.CASCADE)
    name = models.CharField(max_length=256, db_index=True)
    slug = models.SlugField(max_length=256, unique=True)
    logo = models.ImageField(upload_to='logos/', blank=True)

    def __str__(self):
        return str(self.name)

class Category(models.Model):
    name = models.CharField(max_length=256, db_index=True)
    slug = models.SlugField(max_length=256, unique=True)
    icon = models.ImageField(upload_to='categories/', blank=True)

    class Meta:
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return str(self.name)

class Food(models.Model):
    restaurant = models.ForeignKey(Restaurant, related_name='foods', on_delete=models.CASCADE)
    category = models.ForeignKey(Category, related_name='foods', on_delete=models.CASCADE) 
    name = models.CharField(max_length=256, db_index=True)
    slug = models.SlugField(max_length=256, blank=True)
    price = models.IntegerField(default=0)
    description = models.TextField(blank=True)
    image = models.ImageField(upload_to='foods/', blank=True)
    available = models.BooleanField(default=True)

    def __str__(self):
        return str(self.name)


Как видите, класс category не связан напрямую с рестораном. Он фильтруется с помощью файла views.py. Мой views.py выглядит следующим образом:

from django.shortcuts import render, get_object_or_404
from .models import Restaurant, Category, Food


def food_list(request, restaurant_slug, category_slug):
    restaurant = get_object_or_404(Restaurant, slug=restaurant_slug)
    category = get_object_or_404(Category, slug=category_slug)
    foods = Food.objects.filter(restaurant=restaurant, category=category, available=True)
    categories = set(list(Category.objects.filter(foods__restaurant=restaurant)))
    return render(request, 'restaurant/food_list.html', {'restaurant': restaurant, 'category': category, 'foods': foods, 'categories': categories})

def category_list(request, restaurant_slug=None):
    restaurant = get_object_or_404(Restaurant, slug=restaurant_slug)
    categories = set(list(Category.objects.filter(foods__restaurant=restaurant)))
    return render(request, 'restaurant/category_list.html', {'restaurant': restaurant, 'categories': categories})

Как я уже упоминал выше, сейчас это работает хорошо. Но я хочу получить категории и блюда в отношении их ресторанов. Как отфильтровать это с помощью Django REST API?

Пример кода фильтрации в Django :

class PassengerList(generics.ListCreateAPIView):
    model = Passenger
    serializer_class = PassengerSerializer

    # Show all of the PASSENGERS in particular WORKSPACE
    # or all of the PASSENGERS in particular AIRLINE
    def get_queryset(self):
        queryset = Passenger.objects.all()
        workspace = self.request.query_params.get('workspace')
        airline = self.request.query_params.get('airline')

        if workspace:
            queryset = queryset.filter(workspace_id=workspace)
        elif airline:
            queryset = queryset.filter(workspace__airline_id=airline)

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