Получение модели Django только с подмножеством связанных объектов - PullRequest
0 голосов
/ 24 июня 2018

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

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

Допустим, у меня есть Pizza модель, подобная этой:

class Pizza(models.Model):
   ...
   type = models.CharField(...)
   restaurant = models.ForeignKey('Restaurant', related_name='pizzas_offered')
   ...

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

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

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

Как бы я это сделал?

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

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

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Вы можете получить пиццу "Только с ананасами" / "Маргарита" в ресторанах Papa's Pizza следующим образом:

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

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

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

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

UPDATE

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 как pizzas

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 .

0 голосов
/ 24 июня 2018

Вы можете сделать это с помощью служебных программ 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's doc

0 голосов
/ 24 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...