【问题标题】:django - Hide the objects if all its related objects are hiddendjango - 如果所有相关对象都被隐藏,则隐藏对象
【发布时间】:2013-12-02 17:43:02
【问题描述】:

如果所有相关的objects 都被隐藏,如何隐藏object

请让我再解释一下。假设一个用户在一个线程(Thread_1)中有四条消息。他删除/隐藏了该线程中的所有消息。所以现在线程(Thread_1)中没有消息。如何隐藏模板中没有要显示的消息的线程(Thread_1)(其消息全部隐藏)。

models.py

class Thread(models.Model):
    user = models.ManyToManyField(User)

class Message(models.Model):
    thread = models.ForeignKey(Thread)
    sent_date = models.DateTimeField(default=datetime.now)
    body = models.TextField()
    user = models.ForeignKey(User)


class HideMessage(models.Model):
    message = models.ForeignKey(Message)
    user = models.ForeignKey(User)

任何帮助将不胜感激。谢谢!

编辑:

html:

    <div id="inbox">
        <div id="threads">
            {% for thread in all_threads %}
                <div class="thread">
                    <a href="/message/get/{{thread.id}}/">
                    <p>{{thread.id}}
                    {% for user in thread.user.all %}
                        {{user.username}},
                    {% endfor %}
                    </p>
                    </a>
                </div>
            <hr>
            {% endfor %}
        </div>
        <div id="conversation">
            {% for message in messages %}
                {% if message|is_hidden:user %}
                    <div class="messages">
                        <p>{{message.body}}</p>
                        <p>{{message.sent_date}}</p>
                        <p>-{{message.user}}</p>
                    <hr>
                    </div>
                {% endif %}
            {% endfor %}
        </div>
        <div class="clear_left"></div>
    </div>

编辑:

@login_required
def home(request):
    user = request.user

    # Get all the threads of that user
    threads = user.thread_set.all()

    # Order the threads by which thread recieved the latest message.
    order_threads_message = threads.annotate(max_sent_date=Max('message__sent_date')).order_by('-max_sent_date')

    # Get the recent thread
    recent_thread = order_threads_message[0]

    # Get the message of the recent thread
    recent_thread_messages = recent_thread.message_set.all()

    return render(request, 'base.html', {'all_threads':order_threads_message, 'messages':recent_thread_messages})

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    使用 SQL,您可以一次性完成:

    queryset = Thread.objects.extra(select={
        'msg_count': 'select count(*) from appname_message where appname_message.thread_id=appname_thread.id',
        'hidden_count': 'select count(*) from appname_hidemessage where appname_message.thread_id=appname_thread.id',
    }, where=[
        'msg_count > hidden_count',
    ])
    

    这只会选择消息多于隐藏消息的线程。注意:将所有出现的 appname 替换为实际的应用名称。

    但我必须指出,这是一个非常奇怪的建模。一个布尔标志还不够吗?

    【讨论】:

    • 感谢您的回答。那么,隐藏消息应该是0?对不起,我没有得到你。请您再详细说明一下。你能告诉我你认为布尔字段必须在哪里吗?
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2017-03-03
    • 2020-09-03
    • 2011-07-10
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多