переопределить __str __ (self) модели из импортированного приложения - PullRequest
0 голосов
/ 30 апреля 2018

Я сталкиваюсь со следующей ситуацией: у меня есть проект 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. Неабстрактный класс класса ClassA (AbstractClassA)

Теперь, когда я делаю запрос в моем представлении для этого 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», покажите мне «fieldA» + «;» + «fieldB» каждого отфильтрованного элемента в qs).

Я думал о том, чтобы где-то переопределить этот __str__ метод. Но поскольку как исходные, так и последующие аспекты моего процесса выполняются во внешних приложениях, которые я не хочу напрямую изменять (т.е. копировать напрямую в мой проект Django и переписывать определенные части), я не уверен, как мне достичь своей цели .

Есть ли какой-нибудь элегантный способ сделать это?

Пожалуйста, дайте мне знать, если что-то неясно, или я мог бы предоставить вам любую дополнительную информацию. Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Другой подход, помимо обезьянничного патчинга, заключается в использовании моделей прокси .

class MyClassA(ClassA):

    class Meta:
        proxy = True

    def __str__(self)
        return self.attribute

Затем используйте MyClassA вместо ClassA.

0 голосов
/ 30 апреля 2018

Из вашего вопроса не ясно, написаны ли вами неабстрактные классы, но вы можете создать миксины и добавить их в сигнатуру классов ваших конкретных классов, например:

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

тогда

class ClassA(AbstractClassA, NiceStrMixin):
     ...

Если у вас нет доступа к ClassA, вы можете monkey patch AbstractClassA.

...