order_by导致不是不同的项目

时间:2016-11-21 17:54:32

标签: django

我已经实现了一个消息传递系统:

class Message(models.Model):
    user = models.ForeignKey(User, unique=False, related_name = 'messages')
    conversation = models.ForeignKey('Conversation', related_name = 'messages')

    body = models.TextField(max_length=750)
    reads = models.ManyToManyField(User, related_name='read_messages', null=True, blank=True)

    # Other
    date_created = models.DateTimeField(auto_now=False, auto_now_add=True, blank=True)
    date_modified = models.DateTimeField(auto_now=True, auto_now_add=False, blank=True)

class Conversation(models.Model):
    participants = models.ManyToManyField(User, related_name='conversations')
    type = models.CharField(max_length=1, default="D", choices=config.CONVERSATION_TYPE_OPTIONS)

使用Django Rest Framework,我想通过最后一条消息订购对话。

class ConversationFilter(filters.BaseFilterBackend):
    """
    Filters to only show by current user
    """
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(
            participants=request.user,
        ).order_by('-messages__date_created')

但是,一旦我添加order_by方法,查询就不再是不同的了。添加distinct()也不起作用。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

对话和消息之间存在一对多的关系。

当您将消息表加入到Conversation查询中时(使用消息添加order_by子句时会发生这种情况),您将获得多个Conversation条目,每条消息一个。