You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:15:45