在Django抽象BaseModel中实现获取子类全部imported_id的方法
实现抽象基类的类级方法返回子类实例字段列表
要让BaseModel的get_all_imported_id方法适配所有子类,只需将其改为类方法,利用类方法的cls参数获取当前调用的子类模型即可:
from django.db import models class BaseModel(models.Model): id = models.AutoField(primary_key=True) imported_id = models.CharField(max_length=200, blank=True, null=True) class Meta: abstract = True @classmethod def get_all_imported_id(cls): # 通过cls获取当前调用的子类,查询其所有实例 all_objects = cls.objects.all() # 提取非空的imported_id组成列表 return [obj.imported_id for obj in all_objects if obj.imported_id] class Model_1(BaseModel): # 示例子类字段 name = models.CharField(max_length=100) class Model_2(BaseModel): # 示例子类字段 value = models.IntegerField()
关键说明:
- 使用
@classmethod装饰器,让方法可以直接通过类调用(如Model_1.get_all_imported_id()) cls参数会自动传入当前调用方法的子类(调用Model_1时cls就是Model_1,调用Model_2时就是Model_2)- 列表推导式中添加了
if obj.imported_id的过滤,避免返回的列表包含空字符串或None值(如果不需要过滤可删除此条件)
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

