gpt4 book ai didi

django - 从导入的应用程序中覆盖模型的 __str__(self)

转载 作者:行者123 更新时间:2023-12-02 08:07:40 24 4
gpt4 key购买 nike

我面临以下情况:我有一个 django 项目,它使用外部应用程序 [App1]。在 App1 中,它具有以下结构:

  1. 抽象类'Base':

    class Base(models.Model):
    """
    Base model with boilerplate for all models.
    """

    name = models.CharField(max_length=200, db_index=True)
    alternate_names = models.TextField(null=True, blank=True,
    default='')
    ..............
    ..............
    class Meta:
    abstract = True

    def __str__(self):
    display_name = getattr(self, 'display_name', None)
    if display_name:
    return display_name

    return self.name
  2. 基于'Base'的抽象类,称为'AbstractClassA':

    class AbstractClassA(Base):

    display_name = models.CharField(max_length=200)
    ....
    ....

    class Meta(Base.Meta):
    abstract = True

    def get_display_name(self):
    ....
    ....
    return ....
  3. 非抽象类class ClassA(AbstractClassA)

现在,当我在 View 中对此 ClassA 进行查询时,例如:

    qs = ClassA.objects.filter(Q(name__icontains=query_term)....)
return qs

我将此 qs 输入另一个外部应用程序(自动完成),因此当我在我的网络表单上输入“xxxx”时,该表单会根据此 qs 为我提供有关数据库中可用匹配项的建议。

这一切都很好,唯一的事情是,显示给我的潜在匹配列表是 ClassA 对象的默认表示,我追溯到

   def __str__(self):
display_name = getattr(self, 'display_name', None)
if display_name:
return display_name
return self.name

在我之前提到的基本抽象模型中定义。我想要的是,将其他内容显示为潜在匹配列表(例如,代替 'display_name' 或 'name',向我显示 qs 中每个过滤项目的 'fieldA' + ';'+ 'fieldB')。

我的想法是在某处覆盖这个 __str__ 方法。但是因为我的流程的上游和下游方面都是在我不想直接修改的外部应用程序中完成的(即直接复制到我的 Django 项目并重写某些部分),我不确定如何实现我的目标.

有什么优雅的方法吗?

如果有任何不清楚的地方,或者我可以为您提供任何进一步的信息,请告诉我。谢谢!

最佳答案

除了猴子补丁之外的另一种方法是使用 Proxy models .

class MyClassA(ClassA):

class Meta:
proxy = True

def __str__(self)
return self.attribute

然后使用 MyClassA 代替 ClassA

关于django - 从导入的应用程序中覆盖模型的 __str__(self),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093738/

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