Django 从导入的应用程序重写模型的

Django 从导入的应用程序重写模型的,django,django-models,django-autocomplete-light,Django,Django Models,Django Autocomplete Light,我面临以下情况:我有一个django项目,它使用一个外部应用程序[App1]。在App1中,它具有以下结构: 抽象类“基”: class Base(models.Model): """ Base model with boilerplate for all models. """ name = models.CharField(max_length=200, db_index=True) alternate_names = models.TextFiel

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

  • 抽象类“基”:

    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
    
  • 基于“Base”的抽象类,称为“AbstractClassA”:

    class AbstractClassA(Base):
    
        display_name = models.CharField(max_length=200)
        ....
        ....
    
        class Meta(Base.Meta):
            abstract = True
    
        def get_display_name(self):
            ....
            ....
            return ....
    
  • 非抽象类A(AbstractClassA)

  • 现在,当我在视图中查询这个ClassA时,例如:

        qs = ClassA.objects.filter(Q(name__icontains=query_term)....)
        return qs
    
    我将此qs输入另一个外部应用程序(自动完成),这样当我在web表单上键入“xxxx”时,表单将根据此qs为我提供数据库中可用匹配项的建议

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

       def __str__(self):
            display_name = getattr(self, 'display_name', None)
            if display_name:
                return display_name
            return self.name
    
    在我前面提到的基础抽象模型中定义。我想要的是,将其他内容显示为潜在匹配项列表(例如,在qs中,不显示“display_name”或“name”,而是显示每个筛选项的“fieldA”+;“+”fieldB”)

    我的想法是在某个地方重写这个
    \uuu str\uu
    方法。但由于我的流程的上游和下游都是在我不想直接修改的外部应用程序中完成的(即直接复制到我的Django项目并重写某些部分),我不确定如何实现我的目标

    有什么优雅的方法可以做到这一点吗


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

    根据您的问题,不清楚非抽象类是否由您编写,但您可以创建一个mixin并将其添加到具体类的类签名中,例如:

    class NiceStrMixin():
        def __str__(self):
            return self.display_name
    
    然后


    如果您也不能访问
    ClassA
    ,您可以
    AbstractClassA

    除了monkeypatching之外的另一种方法是使用


    然后用
    MyClassA
    代替
    ClassA

    谢谢你,先生,猴子补丁对我有用!这是一个非常好的方法,也可以在我的答案中与mixin方法结合使用。。。
    class ClassA(AbstractClassA, NiceStrMixin):
         ...
    
    class MyClassA(ClassA):
    
        class Meta:
            proxy = True
    
        def __str__(self)
            return self.attribute