与多个对象相同的收件箱主题问题

时间:2018-03-08 23:06:59

标签: python django

我正在使用此Django Messages包。具有相同主题的收件箱中的邮件会多次显示,具体取决于发件人和收件人接收邮件的次数。我想要一种情况,即具有相同主题的邮件只会在收件箱中出现一次而不会出现两次或三次。

enter image description here

我查看了代码,我做了这个

 message_list = Message.objects.inbox_for(request.user).values('subject').distinct()

但仍然没有工作。

{% for message in message_list %}
  <tr>
    <td>{{ message.sender|capfirst }}</td>
    <td>
      {% if message.new %}<strong>{% endif %}
        {% if message.replied %}<em>{% endif %}
        <a href="{{message.get_absolute_url }}">{{ message.subject }}</a>
        {% if message.replied %}</em>{% endif %}
        {% if message.new %}</strong>{% endif %}
    </td>
    <td>{{ message.sent_at|date:_("DATETIME_FORMAT") }} </td>
   {# <td><a href="{% url 'messages_delete' message.id %}">{% trans "delete" %}</a></td>#}
  </tr>
    {% endfor %}

更新:

{% ifchanged message.subject %}
      <a href="{{message.get_absolute_url }}">{{ message.subject }}</a>
{% else %}
  <a href="{{message.get_absolute_url }}">{{ message.subject }}</a>
{% endifchanged %}

1 个答案:

答案 0 :(得分:0)

ordering模型还包含distinct,它将包含在messages.order_by('subject', '-sent_at').distinct('subject') 调用中并使这些行不同。请参阅distinct documentation上的第一个注释。

如果您使用的是PostgreSQL,则可以使用:

distinct

另一个选择是忘记{% ifchanged message.subject %} ... code to display message ... {% endifchanged %} 并使用ifchanged template tag

{% for message in message_list %}
  {% ifchanged message.subject %}
  <tr>
    <td>{{ message.sender|capfirst }}</td>
    <td>
      {% if message.new %}<strong>{% endif %}
        {% if message.replied %}<em>{% endif %}
        <a href="{{message.get_absolute_url }}">{{ message.subject }}</a>
        {% if message.replied %}</em>{% endif %}
        {% if message.new %}</strong>{% endif %}
    </td>
    <td>{{ message.sent_at|date:_("DATETIME_FORMAT") }} </td>
   {# <td><a href="{% url 'messages_delete' message.id %}">{% trans "delete" %}</a></td>#}
  </tr>
  {% endifchanged %}
{% endfor %}

如果您想要显示一定数量的消息,这将是一个问题。

我之前已经删除了大部分细节,但鉴于您的更新,请更清楚一点:

ifchanged

您需要将for标记立即放在SparkSession spk = SparkSession.builder().master("somewhere").getOrCreate(); Dataset<Row> x = spk.createDataFrame(someList); 循环中。