我的Django应用程序有一个Post
类,它有几个子类TextPost
,AudioPost
等,每个子类都有自己的render_html()
方法。
class Post(models.Model):
author = models.ForeinKey(User,...)
title = models.CharField(...)
pub_date = models.DateTimeField(...)
...
def render_html(self):
return "rendered title, author date"
class AudioPost(Post):
audioFile = FileField(...)
def render_html(self):
return "Correct audio html"
...
这些子模型中的每一个都有一个ModelForm
,其中包含上传,验证和保存的规则。
在主页视图中,我想收集所有帖子,按日期排列并渲染它们。对我来说,这应该像
一样简单## in view
context = { 'posts' : Post.objects.order_by('-pub_date')[:5] }
和
## in template
{{ post.render_html() | safe }}
我记得用Java编写抽象类的方法。但是当我在Python中这样做时,render_html
方法被调用,好像它们都是父类的成员一样。我已经查看了Django如何进行多表继承,看起来我要么逐个检查生成的OneToOneFields
,直到我找到一个不引发异常,或者使用{{ 1}}公用事业经理。这两种方式中的一种是最好的方法吗?或者我应该做些什么?
答案 0 :(得分:0)
我建议你的问题的另一种方法,你可以用它来获取基类的所有子类。由于您不需要手动为每个子类设置查询,因此它会有点方便
querysets_child = [child_cls.objects.all() for child_cls in vars()['BaseClass'].__subclasses__()]
您所参考的方法适用于java,但我不认为它可以在这里工作。您可以手动使用子类,也可以使用上面提到的子类函数获取所有子类。
答案 1 :(得分:0)
我通过Post
内的以下方法解决了这个问题,这允许我做
{{ post.get_subclass().render_html() }}
在模板内。假设有4个子类AudioPost
,VideoPost
,TextPost
和RichTextPost
:
from django.db import models
from django.core.exceptions import ObjectDoesNotExist
class Post(models.Model):
...
...
def get_subclass(self):
try:
textpost = self.textpost
return textpost
except ObjectDoesNotExist:
pass
try:
audiopost = self.audiopost
return audiopost
except ObjectDoesNotExist:
pass
try:
videopost = self.videopost
return videopost
except ObjectDoesNotExist:
pass
try:
richtextpost = self.richtextpost
return richtextpost
except ObjectDoesNotExist:
pass
raise ObjectDoesNotExist