Bisect查询集围绕另一个模型的查询集

时间:2009-01-15 11:50:00

标签: django django-models

我正在编写一个带有多个区域的用户驱动的应用程序。我希望允许用户自定义其消息设置,以便他们只收到有关他们关心的部件和操作的电子邮件。我已经制定了以下Class

class EmailSetting(models.Model):
    user = models.ForeignKey(User, related_name="%(class)s_related_user")
    key = models.CharField(max_length=50)
    value = models.BooleanField()

这将由名为get_users(key, default)的方法使用,应该返回用户列表。例如,如果我要求key="new_post", default=False上的子用户列表,我应该获得一个用户列表,其中有一个电子邮件设置,其值为True。这很简单,因为我可以使用EmailSetting模型。

如果默认值为True,则事情似乎更难。我从未做过比使用模型的基本查找更复杂的事情,所以我需要一只手。

从完整的用户列表中,我需要删除带有错误电子邮件设置的用户。如果没有在EmailSetting上查找False条目并迭代地将它们从第一个查询集中删除,我就看不到如何执行此操作...

...但必须是另一种方式,因为它很臭。

2 个答案:

答案 0 :(得分:1)

这就是我如何做到的:

def get_users(key, default):
    if not default:
        return [es.user for es in EmailSetting.objects.filter(key = key, value = True)]
    return User.objects.exclude(pk__in = [es.user.pk for es in EmailSetting.objects.filter(key = key, value = False)])

当你想到它时,非常简单!总是喜欢Python语法=)

答案 1 :(得分:0)

我在用户字段中更改了您的相关名称,因为我认为您不想在名称中引用带有“user”的EmailSetting。

def get_users(key, default):
    if default:
        return User.objects.exclude(emailsetting__key=key, emailsetting__value=False)
    else:
        return User.objects.filter(emailsetting__key=key, emailsetting__value=True)
相关问题