Как я могу фильтровать элементы в 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