仅获取相关对象子集的Django模型

时间:2018-06-23 21:22:40

标签: python django django-models django-rest-framework

我正在尝试仅使用与特定条件匹配的相关对象子集来检索特定的Django模型。例如,我要获取一个特定的Restaurant,并返回在这家餐厅提供的所有Pizza素食主义者。

例如,如果我有一个名为Restaurant的{​​{1}},可以提供一些比萨饼。

假设我有一个Papa's Pizza模型,如下所示:

Pizza

class Pizza(models.Model): ... type = models.CharField(...) restaurant = models.ForeignKey('Restaurant', related_name='pizzas_offered') ... 提供以下Papa's Pizza

  • PizzaMargherita
  • type='vegetarian'Pepperoni
  • type='carnivore'Pineapple-Only

我想在type='vegetarian字段中仅使用Papa's PizzaMargherita的披萨来检索Pineapple-Only模型。

我将如何实现这一目标?

如果有帮助的话,我也正在使用Django Rest Framework,因此,如果您对此有任何经验,并且该功能可能存在于Serializer中而不是模型中,那也可以使用

非常感谢您!

3 个答案:

答案 0 :(得分:3)

Django默认不会检索任何相关对象。您必须通过my_restaurant.pizzas_offered.all()从实例中专门这样做。现在,这是一个查询集,因此您可以根据需要轻松过滤它:my_restaurant.pizzas_offered.filter(type='vegetarian')

答案 1 :(得分:1)

您可以从Papa's Pizza餐厅获得菠萝专用/ Margherita披萨,如下所示:

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”序列化为“ 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

答案 2 :(得分: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's doc

中找到更多信息。