我已经实现了一个消息传递系统:
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()
也不起作用。这是怎么回事?
答案 0 :(得分:1)
对话和消息之间存在一对多的关系。
当您将消息表加入到Conversation查询中时(使用消息添加order_by子句时会发生这种情况),您将获得多个Conversation条目,每条消息一个。