gpt4 book ai didi

python - 如何使父类(super class)查询集返回子类对象?或者将父类(super class)查询集向下转换为子类列表?

转载 作者:行者123 更新时间:2023-11-28 18:40:40 24 4
gpt4 key购买 nike

我在一个 Django 项目中工作,我需要在同一个 View 中按日期列出两个不同的模型。为了实现这一点,我使用继承来将它们全部放入通用查询集中。我的模型是:

class Publication(models.model):
title = models.CharField(max_lengh = 200)
pub_date = models.DateTimeField(default = datetime.now)
headline = models.TextField()

class Meta:
abstract = True

@abc.abstractmethod
def say_hello(self):
return

class New(Publication):
author = models.ForeignKey(Author)
source = models.CharField(max_length = 200)
categories = models.ManyToManyField(Category)
url = '/news/'

def say_hello(self):
return "Hello New!!!"

class Opinion(Publication):
writer = models.ForeignKey(Writer)
style = .models.CharField(max_length=3, choices=(('txt', 'Text'), ('glr', 'Galery')))
url = '/opinions/'

def say_hello(self):
return "Hello Opinion!!!"

我试图在像这样遍历 Publication QuerySet 时调用子类方法:

publications = Publications.objects.all().order_by('-pub_date')
for pub in publications:
pub.say_hello()
url = pub.url

问题是我的 QuerySet 正在返回 Publication 对象,所以我无法访问子属性和方法,显然是因为我正在处理 Publication 对象。我将 Publication 设置为抽象类的事实不应该避免处理 Publication 对象的可能性吗?不应该阻止它们被实例化吗?是否有任何选项可以在 Publication 类中执行 QuerySet 并返回包含子对象的列表?

如果没有。你们会如何解决这种情况?我真的可以使用一些技巧。

最佳答案

听起来使用多表继承和 Django 多态可能比较合适:

多表继承:https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

Django 多态:http://django-polymorphic.readthedocs.org/en/latest/

django 中的多表继承允许您拥有一个包含基本字段的基本模型/表。然后您的子类定义放在它们自己的表中的扩展字段。当您使用来自任何子类的查询集获取记录时,您将从基础模型/表和子类模型/表中获取每条记录的信息。

为了使用基本模型的查询集获取记录,并为每个结果获取适当子类的实例,一种选择是 django 多态。我以前用过它,效果很好。它肯定有其局限性,但我会试一试。

关于python - 如何使父类(super class)查询集返回子类对象?或者将父类(super class)查询集向下转换为子类列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26538668/

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