Django多表继承:如何从父模型Place访问子模型的serves_pizza字段
问题描述
我定义了以下Django模型:
from django.db import models class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) class Restaurant(Place): serves_hot_dogs = models.BooleanField(default=False) serves_pizza = models.BooleanField(default=False)
需求
如何从父模型Place访问serves_pizza字段?
我的使用场景是需要在父模型序列化器PlaceSerializer中访问serves_pizza字段,代码框架如下:
class PlaceSerializer(serializers.ModelSerializer): serves_pizza = serializers.SerializerMethodField() class Meta: model = Place fields = '__all__' def get_serves_pizza (self, obj): serves_pizza = Restaurant.objects.get(**???**) return serves_pizza
请问如何完善上述get_serves_pizza方法,实现从父模型访问子模型的serves_pizza字段?
解决方案
由于你使用的是Django的多表继承,父模型Place的实例会对应一个可选的Restaurant实例,Django会自动为父模型生成一个反向关联属性,默认名称为子模型类名的小写形式——restaurant。
高效实现方式(推荐)
直接通过反向属性访问,无需额外查询数据库:
def get_serves_pizza(self, obj): # 判断当前Place实例是否关联了Restaurant if hasattr(obj, 'restaurant'): return obj.restaurant.serves_pizza # 未关联时返回默认值,可根据需求调整为None return False
显式查询方式
如果一定要通过Restaurant.objects.get()实现,可借助父模型的主键过滤:
def get_serves_pizza(self, obj): try: restaurant = Restaurant.objects.get(place_ptr=obj) return restaurant.serves_pizza except Restaurant.DoesNotExist: return False
优化提示
- 第一种方式配合
select_related('restaurant')使用时,能避免N+1查询问题,大幅提升性能。 - 统一处理
Restaurant不存在的场景,避免序列化时抛出异常。
内容的提问来源于stack exchange,提问作者Mohammad AlQudah
相关产品推荐
相关产品推荐

