Когда использовать метод __str___ внутри модели Django? - PullRequest
1 голос
/ 06 марта 2020

Я создал модель Django со следующими атрибутами.

class Info(models.Model):
    number = models.IntegerField()
    ID = models.IntegerField()
    reading = models.IntegerField()
    date = models.DateField()

Я хотел бы сделать так, чтобы при поиске пользователем «ID» или «номера» из базы данных, им показывают дату и чтение. Вот мой код результатов поиска в views.py:

class SearchResultsView(ListView):
    model = Info
    template_name = 'search_results.html'

    def get_queryset(self): 
        query = self.request.GET.get('q')
        reading_list = Info.objects.filter(
            Q(ID__icontains=query) | Q(number__icontains=query)
        )
        return reading_list

А вот мой search_results. html template:

<h1>Search Results</h1>

<ul>
  {% for reading in reading_list %}
    <li>
      {{ reading.reading }}, {{ reading.date }}
    </li>
  {% endfor %}
</ul>

Я немного запутался, стоит ли мне включите в мою модель метод ' str '. Сможет ли приложение печатать дату и чтение, используя только этот код?

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Исходя из ваших текущих настроек, нет необходимости добавлять функцию __str__ в вашу модель, потому что вы используете поля экземпляра, а не сам экземпляр.

Однако, если есть какие-либо ссылки на сам экземпляр, например, внешний ключ к этой модели, или вы просто хотите проверить сам экземпляр, добавление функции __str__ повысит читабельность. Вы можете проверить документацию __str__ для подробностей.

Без поля __str__, если у вас есть экземпляр Info, у вас будет: <Info: Info object (1)>. Например, после добавления функции __str___ и возврата str (id) вы увидите <Info: 1>.

Было бы здорово иметь CharField (например, description = models.CharField()) в вашей информационной модели, если вы хотите добавить функцию __str__. Тогда представление этого объекта будет <Info: Good Reading>

0 голосов
/ 06 марта 2020

Всякий раз, когда экземпляр модели создается в Django, он отображает объект как объект ModelName (1). Чтобы внести изменения в модель Django, используя эту

def __str__(self): 
    return str(self.id) #if its integer, make it str
    return self.name #if its already str. you dont make it str

, он изменяет отображение имя от ModelName Object (1) до имени поля def __str__(self): в вашей панели администратора. и одна вещь def __str__(self) для python 3 и def __unicode__(self): для python 2

...