【问题标题】:exclude a query result in another query在另一个查询中排除查询结果
【发布时间】:2014-02-21 00:14:19
【问题描述】:

这里我想做的是,我想列出所有没有阻止我的人。在表中 Blocked 有两列名称 whowhose 。在 whose 列中存储我阻止的人的 ID,在 who 列中存储我的 ID。现在我想这样做,当被阻止的人点击 查看人按钮在我的网页中,他看不到阻止他的人的个人资料。

当我进行此查询时 blocked_list = Blocked.objects.filter(whose = user_id)。现在我得到了阻止我的人的名单。现在我想从这个查询中排除所有这个人 total_profiles = persons.objects.all().exclude(blocked_list)。我该怎么做。

models.py

class persons(models.Model):
    full_name = models.CharField(max_length=200)


class blocked(models.Model):
    who = models.ForeignKey(persons)
    whose = models.IntegerField(null=True) 

views.py

def blocked(request): 
    blocked_list = Blocked.objects.filter(whose = user_id) 
    total_profiles = persons.objects.all().exclude(blocked_list)
    return render_to_response('profiles/view_all.html', {'total_profiles':total_profiles,'}, context_instance=RequestContext(request),) 

如果问题不正确,请更正。

【问题讨论】:

    标签: django python-2.7


    【解决方案1】:

    你可以试试这个:

    total_profiles = persons.objects.all().exclude(id__in = blocked_list.values_list('id', flat=True))
    

    未经测试,但改编自this answer

    一些注意事项:

    • 如果persons有默认管理器,可以省略all()
    • whose 没有索引,所以当你的数据集变大时它会变慢。您可以使用 ForeignKey 字段而不是 IntegerField
    • 常见的约定是类名大写,模型名用单数写,即Person而不是persons

    【讨论】:

    • 当数据集变大时它会如何变慢。如果您不介意请解释一下,因为我是 django 和 python.thanks@Daniel Hepper 的新手
    • 这并不是 Django 特有的。默认情况下,IntegerField 没有索引。因此,数据库必须将user_idblocked 表中的所有行进行比较。当您的数据集变得很大(数百万行)时,这会变得很慢。
    • 好的。非常感谢您的回答。让我再问一件事。如果我将其列作为用户的外键,我如何跳过该数据库比较。@Daniel Hepper
    • Django 自动为ForeignKey 字段创建索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2016-04-06
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多