2009-01-15 79 views
0

我正在用幾個區域來編寫用戶驅動的應用程序。我希望允許用戶自定義他們的消息設置,以便他們只收到有關他們關心的部分和操作的電子郵件。我已經制定了以下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中的用戶列表,那麼我應該得到一個用戶列表,其中他們的EmailSetting的值爲True,表示該密鑰。這很簡單,因爲我可以使用EmailSetting模型。

如果默認值爲True,事情似乎更難。我從來沒有做過任何比模型基本查找更復雜的事情,所以我需要一個手。

從用戶的完整列表中,我需要刪除帶有False EmailSetting的用戶。短期上做EmailSetting尋找虛假記載和反覆切割出來的第一查詢集的另一個查詢的,我看不出如何做到這一點...

...但有必須是另一種方式,因爲這太臭。

回答

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) 
+0

你能發佈你如何改變EmailSetting類嗎?我已經從它的末尾刪除了_user並重置了SQL,但是我收到了FieldError:無法將關鍵字'emailsetting'解析爲字段。類型錯誤。 – Oli 2009-01-15 13:02:00

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語法=)