Получение модели Django только с подмножеством связанных объектов

Я пытаюсь получить определенную модель Django только с подмножеством связанных объектов, которые соответствуют определенным критериям. Например, я хочу получить конкретную информацию Restaurantи вернуть все Pizzaсервисы в этом ресторане, которые являются вегетарианскими.

Например, если у меня есть Restaurantимя, Papa's Pizzaкоторое обслуживает некоторые пиццы.

Предположим, у меня есть такая модель:class Pizza(models.Model): ... type = models.CharField(...) restaurant = models.ForeignKey('Restaurant', related_name='pizzas_offered') ...

Papa's Pizza

И Pizzaпредлагает следующие Pizzas:

  • Margherita( type='vegetarian')
  • Pepperoni( type='carnivore')
  • Pineapple-Only( type='vegetarian)

Я хотел бы получить Papa's Pizzaмодель только с пиццей Margheritaи Pineapple-Onlyпиццей pizzas_offered.

Как я могу это сделать?

Если это вообще помогает, я также использую Django Rest Framework , поэтому, если у вас есть какой-либо опыт, и функциональность может существовать Serializerне в модели, но и в работе.

Большое спасибо!

python,django,django-models,django-rest-framework,

0

Ответов: 3


1 принят

Вы можете выполнить это с помощью утилиты Django для предварительной выборки.

from django.db.models import Prefetch

pizzas = Pizza.objects.filter(type='vegetarian')
restaurant = Restaurant.objects 
    .prefetch_related(Prefetch('pizzas_offered', pizzas)) 
    .get(name="Papa's Pizza")

Дополнительную информацию вы можете найти в докторе Django


3

Django не извлекает никаких связанных объектов по умолчанию. Вы должны специально сделать это из экземпляра через my_restaurant.pizzas_offered.all(). Теперь, это QuerySet, так что вы можете так же легко отфильтровать его , как вам нравится: my_restaurant.pizzas_offered.filter(type='vegetarian').


1

Вы можете получить пиццу Pineapple-Only / Margherita из ресторанов Pizza от Papa:

restaurant = Restaurant.objects.get(name="Papa's Pizza")
veg_pizzas = restaurant.pizzas_offered.filter(type='vegetarian')

Вышеизложенное делает следующее:

  1. Получить ресторан
  2. Извлеките пиццу выбранного ресторана для определенных типов

Надеюсь, поможет.

ОБНОВИТЬ

class Restaurant(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)

    def get_pizzas(self, type):
        return self.pizzas_offered.filter(type=type)

# Get vegetarian pizzas from Papa's Pizza restaurant
$> restaurant = Restaurant.objects.get(name="Papa's Pizza")
$> pizzas = restaurant.get_pizzas(type='vegetarian')  

ОБНОВЛЕНИЕ 2

Запрос: сериализатор ресторана, который сериализует «pizzas_offered» как «пиццу»,

class RestaurantSerializer(serializers.ModelSerializer):
    pizzas = serializers.SerializerMethodField()

    class Meta:
        model = Restaurant
        fields = ('name', 'pizzas')

    def get_pizzas(self, restaurant):
        return PizzaSerializer(restaurant.pizzas_offered.all(), many=True).data

Документация: http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield .

питон, Джанго, Джанго-модель, Джанго-отдых-рамка,
Похожие вопросы
Яндекс.Метрика