Python 检索仅包含相关对象子集的Django模型

Python 检索仅包含相关对象子集的Django模型,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我试图检索一个特定的Django模型,其中只有一部分相关对象符合特定条件。例如,我想获得一家特定的餐厅,并返回该餐厅供应的所有素食比萨饼 例如,如果我有一家名为“爸爸的比萨饼”的餐厅,提供一些比萨饼 假设我有一个比萨饼模型,如下所示: class Pizza(models.Model): ... type = models.CharField(...) restaurant = models.ForeignKey('Restaurant', related_name='pizz

我试图检索一个特定的Django模型,其中只有一部分相关对象符合特定条件。例如,我想获得一家特定的
餐厅
,并返回该餐厅供应的所有素食比萨饼

例如,如果我有一家名为“爸爸的比萨饼”的
餐厅
,提供一些比萨饼

假设我有一个
比萨饼
模型,如下所示:

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

  • margarita
    type='素食者'
  • Pepperoni
    type='carnivore'
  • 仅菠萝
    type='素食者
我想在
pizzas\u offered
字段中检索
Papa's Pizza
模型,其中只有
margerita
spiral only
比萨

我将如何着手实现这一点

如果它有帮助的话,我也在使用它,因此如果您对此有任何经验,并且功能可能存在于模型中,而不是模型中,那么这也会起作用


多谢各位

默认情况下,Django不会检索任何相关对象。您必须通过
my\u restaurant.pizzas\u provided.all()
从实例中明确执行此操作。现在,这是一个查询集,因此您可以随意轻松地对其进行筛选:
my_restaurant.pizzas\u提供。filter(type='素食者')
默认情况下,Django不会检索任何相关对象。您必须通过
my\u restaurant.pizzas\u provided.all()
从实例中明确执行此操作。现在,这是一个查询集,因此您可以根据自己的喜好轻松筛选:
my_restaurant.pizzas\u提供。filter(type='素食者')
您可以从爸爸的比萨餐厅获得菠萝/玛格丽塔比萨,如下所示:

restaurant = Restaurant.objects.get(name="Papa's Pizza")
veg_pizzas = restaurant.pizzas_offered.filter(type='vegetarian')
上述措施的作用如下:

  • 取回餐厅
  • 检索指定类型的选定餐厅的比萨饼
  • 希望能有帮助

    更新

    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

    请求:餐厅连载员,将“提供的比萨”连载为“比萨”

    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
    

    文档:。

    您可以从爸爸的比萨餐厅获得菠萝比萨/玛格丽塔比萨,如下所示:

    restaurant = Restaurant.objects.get(name="Papa's Pizza")
    veg_pizzas = restaurant.pizzas_offered.filter(type='vegetarian')
    
    上述措施的作用如下:

  • 取回餐厅
  • 检索指定类型的选定餐厅的比萨饼
  • 希望能有帮助

    更新

    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

    请求:餐厅连载员,将“提供的比萨”连载为“比萨”

    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
    

    文档:。

    您可以通过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的预取实用程序来实现这一点

    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")
    

    您可以在

    上找到更多信息,调用
    .filter(…)
    my_restaurant
    实例上进行筛选也是如此?我不确定您在问什么
    my_restaurant.pizzas_offered
    是对该餐厅提供的比萨的查询
    filter
    根据括号中提供的标准进一步缩小范围。如果我在代码中的其他地方使用
    my_restaurant
    ,它是否只有
    Margarita
    菠萝
    ?例如,如果有人向我的服务器发送只吃素食比萨的请求,而我返回一个序列化的
    my_restaurant
    作为响应,不需要的比萨会出现在该响应中吗?你必须发布你的序列化程序,并在问题中查看,以获得“不需要的比萨会出现在该响应中吗?”调用
    .filter(…)
    会对
    my_restaurant
    实例进行筛选吗?我不确定你在问什么
    my_restaurant.pizzas_offered
    是对该餐厅提供的比萨的查询
    filter
    根据括号中提供的标准进一步缩小范围。如果我在代码中的其他地方使用
    my_restaurant
    ,它是否只有
    Margarita
    菠萝
    ?例如,如果有人向我的服务器发送只吃素食比萨的请求,而我返回一个序列化的
    my_restaurant
    作为响应,不需要的比萨会出现在该响应中吗?你必须发布你的序列化程序,并在问题中查看,以获得“不需要的比萨会出现在该响应中吗?”我想要一个
    my_restaurant
    的例子,在那里
    pizzas\u提供的物品只有
    Margarita
    菠萝
    。这能做到吗?@quotas当然是
    margerita
    spinapole Only
    素食者
    比萨饼。这是一个例子,展示了如何在给定餐厅名称的情况下获得指定类型的比萨饼。我想将过滤后的比萨饼作为餐厅中的一个字段返回,我认为这不能满足我的要求。请您确认您所指的
    餐厅
    是否为
    餐厅
    模型或其序列化程序?如果是它的模型,那么您可以在
    餐厅
    模型中创建一个方法来实现这一点。我想要一个
    我的餐厅
    的实例,其中
    比萨
    中提供的唯一对象是
    玛格丽塔
    菠萝
    。这能做到吗?@quotas当然是
    margerita
    spinapole Only
    素食者
    比萨饼。这是一个例子,展示了如何在给定餐厅名称的情况下获得指定类型的比萨饼。我想将过滤后的比萨饼作为餐厅中的一个字段返回,我认为这不能满足我的要求。请您确认您所指的
    餐厅
    是否为
    餐厅
    模型或其序列化程序?如果是它的模型,那么您可以在
    餐厅
    模型中创建一个方法来实现这一点。