Запрос модели django для получения сет-листов - PullRequest
0 голосов
/ 22 октября 2019

Я хочу получить все объекты, связанные с пользователем, и разделить полученный список на три различных списка в пользовательском интерфейсе в соответствии с некоторой дополнительной логикой. В настоящее время я делаю это, устанавливая @property для модели, а затем выполняю несколько циклов и if / else в шаблоне. Это, очевидно, неоптимально, поскольку я не хотел бы включать заголовки разделов, если в текущем разделе ничего нет, но, поскольку я добавляю один большой список, нет состояния empty.

Текущий:

модель

class Entry(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     publish_date = models.DateField(null=True, blank=True)
     favorite = models.BooleanField(default=False)

просмотр

entries = Entry.objects.filter(user=request.user)

шаблон

<strong>FAVORITES</strong>
{% for obj in entries %}
  {% if obj.group == 'favorites' %}
    ...
  {% endif %}
{% endfor %}

<strong>PUBLISHED</strong>
{% for obj in entries %}
  {% if obj.group == 'published' %}
    ...
  {% endif %}
{% endfor %}

<strong>DRAFT</strong>
{% for obj in entries %}
  {% if obj.group == 'draft' %}
    ...
  {% endif %}
{% endfor %}

Как добавить метод в модель (например, get_groupings), который мог бы возвращать dict с тремя отдельными наборами запросов ('entry [' favourites = ')) эффективным способом для базы данных?

1 Ответ

0 голосов
/ 22 октября 2019

если вы пишете в свою базу данных редко и читаете часто, лучше всего сохранить вашу собственность в поле базы данных и сделать секунду .filter() для этого.

В противном случае, да, вы должны добавитьметод на модели - вот где эта логика принадлежит. Если вы хотите, чтобы он возвращал все три группы каждый раз, то не существует такого понятия, как более или менее эффективное использование базы данных: просто извлеките все объекты из БД один раз, как вы это делаете сейчас, затем используйте понимание списка илилюбить. Производительность этого не должна беспокоить. Если это так: см. Первый абзац.

...