在order_by中按字段过滤

时间:2014-10-10 06:47:13

标签: python django django-models

我有这些模特:

class EntryRank(models.Model):
    value = models.FloatField(default=0)
    user = models.ForeignKey('SomeUser')
    entry = models.ForeignKey('Entry')

class Entry(models.Model):
    feed = models.ForeignKey('RSSFeed')
    title = models.TextField()
    content = models.TextField()
    link = models.URLField(max_length=500)
    date = models.DateTimeField()
    rank = models.ManyToManyField('EntryRank', related_name='entry_rank')
    is_read = models.BooleanField(default=False)
    is_ignored = models.BooleanField(default=False)

class RSSFeed(models.Model):
    url = models.URLField(max_length=500)
    title = models.CharField(max_length=275)
    entries = models.ManyToManyField('Entry', blank=True)
    last_update = models.DateTimeField(auto_now_add=False, null=True, blank=True)

class SomeUser(models.Model):
    user = models.ForeignKey('auth.User')
    rss_feeds = models.ManyToManyField('RSSFeed', blank=True)
    words = models.TextField(blank=True)

问题是我需要按rank对条目进行排序,并以某种方式按特定用户过滤排名。

让我们说2位用户:User AUser B
有两个条目:

Entry1: User A: 0.1
Entry1: User B: 0.12
Entry2: User A: 0.06
Entry2: User B: 0.2

在这种情况下,我需要单独为每个用户排序条目 因此User A应该看到如下列表:

Entry1 Entry2

User B

Entry2 Entry1

在每种情况下,我需要通过某些 order_byEntryRank

到目前为止,我有:

Entry.objects.all().order_by('-rank__value')

1 个答案:

答案 0 :(得分:1)

试试这个:

EntryRank.objects.all().exclude(user__user__id = user_id).order_by('-rank', 'user__id')

在这种情况下,您使用exclude子句过滤一些用户,并按EntryRank.rank来排序结果 您可以增加exclude子句的复杂性,如:

user__user__user__username__in = [auth_user.id1, auth_user.id2,.. ]

迭代结果后,您可以从Entry对象获取SomeUsersEntryRank个引用

for entry_rank in EntryRank.objects.all().exclude(user__user__id = user_id).order_by('-rank', 'user__id'):
    entry_rank.value    #rank
    entry_rank.user     #SomeUser
    entry_rank.entry    #Entry