我正在尝试仅使用与特定条件匹配的相关对象子集来检索特定的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
:
Pizza
(Margherita
)type='vegetarian'
(Pepperoni
)type='carnivore'
(Pineapple-Only
)我想在type='vegetarian
字段中仅使用Papa's Pizza
和Margherita
的披萨来检索Pineapple-Only
模型。
我将如何实现这一目标?
如果有帮助的话,我也正在使用Django Rest Framework,因此,如果您对此有任何经验,并且该功能可能存在于Serializer
中而不是模型中,那也可以使用
非常感谢您!
答案 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')
以上内容执行以下操作:
希望有帮助。
更新
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
中找到更多信息。