在Django中向查询集添加属性

Nan*_*nor 3 python django

我正在创建一个消息传递系统,我想要做的部分是基于用户是消息的发送者还是接收者,不同的CSS加载.我试图通过将属性附加到标识这个的每个消息对象来实现此目的.

我有我的信息

#models.py
class Message(models.Model):
    def __unicode__(self):
        return unicode(self.time_date)

    message_from = models.ForeignKey(User, related_name="%(class)s_message_from")
    message_to = models.ForeignKey(User, related_name="%(class)s_message_to")
    message = models.TextField()
    file = models.FileField(blank=True, null=True)
    read = models.BooleanField(default=False)
    time_date = models.DateTimeField(default=django.utils.timezone.now)
    job = models.ForeignKey(Job, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

以及我获取消息的观点:

def view_messages(request):
    messages = Message.objects.filter(message_to=request.user, job_id=None).distinct('message_from')
    messages_from_user_ids = messages.values_list('message_from', flat=True).distinct()

    messages_from_user = User.objects.filter(id__in=messages_from_user_ids)

    messages = Message.objects.filter(
        Q(message_to=request.user) & Q(message_from_id=messages_from_user_ids[0]) & Q(job_id=None) | Q(
            message_from_id=messages_from_user_ids[0]) & Q(
            message_from_id=request.user) & Q(job_id=None)).order_by('time_date')

    messages = Message.objects.annotate(foo='true') # error

    return render(request, 'freelancestudent/general/messages.html', {'messages': messages,
                                                                      'messages_from': messages_from_user})
Run Code Online (Sandbox Code Playgroud)

我在线评论错误中试图实现的是简单地通过将字符串注释到每个可在其下访问的消息对象来测试注释.这给了我错误.'true'foo'str' object has no attribute 'resolve_expression'

我最终想要实现的是,如果我以错误的方式解决这个问题,那就是检查用户是否是发件人.我实现它的想法是做这样的事情:

for message in messages:
    if message_from == request.user.id:
        messages.annotate(sender=True)
Run Code Online (Sandbox Code Playgroud)

虽然,这不是正确的语法.我也不确定annotate是不是正确的功能.有任何想法吗?

Ala*_*air 6

如果循环查询集,请不要尝试使用annotate,只需在实例上设置属性即可.

for message in messages:
    if message_from == request.user.id:
        message.sender = True
Run Code Online (Sandbox Code Playgroud)

另外,我想你可以使用annotateCase:

from django.db.models import BooleanField, Case, Value, When

messages = Message.annotate(
    sender=Case(
        When(message_from=request.user, then=Value(True)),
        default=Value(False),
        output_field=BooleanField(),
    )
)
Run Code Online (Sandbox Code Playgroud)