gpt4 book ai didi

python - 您可以从 Django ORM 的父类(super class)模型中访问子类模型吗?

转载 作者:行者123 更新时间:2023-11-28 17:55:07 25 4
gpt4 key购买 nike

假设我按照下面定义的方式设置了模型继承。

class ArticleBase(models.Model):
title = models.CharField()
author = models.CharField()

class Review(ArticleBase):
rating = models.IntegerField()

class News(ArticleBase):
source = models.CharField()

如果我需要按标题排序的所有文章的列表(在本例中为评论和新闻),我可以在 ArticleBase 上运行查询。一旦我有一个 ArticleBase 记录,有没有一种简单的方法可以确定它是否与评论或新闻记录相关,而无需查询两个模型来查看哪个模型具有我所在记录的外键?

最佳答案

我假设所有 ArticleBase 实例都是 ArticleBase 子类的实例。

一种解决方案是将子类名称存储在 ArticleBase 和一些根据该信息返回子类或子类对象的方法中。由于多表继承在父实例上定义了一个属性来访问子实例,所以这一切都非常简单。

from django.db import models

class ArticleBase(models.Model):
title = models.CharField()
author = models.CharField()
# Store the actual class name.
class_name = models.CharField()

# Define save to make sure class_name is set.
def save(self, *args, **kwargs):
self.class_name = self.__class__.__name__
super(ArticleBase, self).save(*args, **kwargs)

# Multi-table inheritance defines an attribute to fetch the child
# from a parent instance given the lower case subclass name.
def get_child(self):
return getattr(self, self.class_name.lower())

# If indeed you really need the class.
def get_child_class(self):
return self.get_child().__class__

# Check the type against a subclass name or a subclass.
# For instance, 'if article.child_is(News):'
# or 'if article.child_is("News"):'.
def child_is(self, cls):
if isinstance(cls, basestring):
return cls.lower() == self.class_name.lower()
else:
return self.get_child_class() == cls

class Review(ArticleBase):
rating = models.IntegerField()

class News(ArticleBase):
source = models.CharField()

这绝不是解决此问题的唯一方法。然而,这是一个非常简单直接的解决方案。出色的 contrib contenttypes 应用程序和利用它的通用模块提供了丰富的通用方法来执行此操作。

在 ArticleBase 中包含以下内容可能会很有用:

def __unicode__(self)
return self.get_child().__unicode__()

在那种情况下,请注意未能在子类中定义 __unicode__,或在 ArticleBase 的实例(未被子类化的实例)上调用 __unicode__ 会导致到无限递归。因此下面的警告会重新进行完整性检查(例如,直接防止 ArticleBase 的这种实例化)。

免责声明:

此代码未经测试,我确定其中有一两个错字,但基本概念应该是正确的。生产级代码可能应该进行一些健全性检查以拦截使用错误。

关于python - 您可以从 Django ORM 的父类(super class)模型中访问子类模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com