2011-03-19 146 views
0

我不知道如何正確描述這一點。但我的模型看起來像這樣:Django:一對多的關係更新

class Post(models.Model): 
    title = models.CharField(max_length=250) 
    body = models.TextField() 
    published = models.DateTimeField(null=True, blank=True) 
    updated = models.DateTimeField(null=True, blank=True) 
    user = models.ForeignKey(User) 

class Unread(models.Model): 
    user = models.ForeignKey(User) 
    post = models.ForeignKey(Post) 

我的問題是,當我嘗試更新未讀模式。在我的 「用戶列表」 可以說我有用戶ID[1,3,5]

我未讀模式有:

ID USER POST 
1 1  1 # will row will remain because userid 1 is found in "userlist" 
2 2  1 # --- this row would be deleted because USER is not found in "userlist" 
3 3  1 # will also remain because userid 3 is found in "userlist" 
4 5  1 # NEW RECORD added because 5 was in "userlist" but not in Unread 

注:ID是自動增量。

Django有一個「自動」的方式嗎?或者什麼是處理這些類型場景的「推薦」方式?

我以前遇到過這個問題幾次,我記得我處理這個問題的「最懶」方式是刪除Unread模型中的所有內容,然後添加「userlist」中的所有內容。

最好的問候, W¯¯

回答

3

http://docs.djangoproject.com/en/dev/ref/models/querysets/#in http://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list

有可能是一個更好的辦法來acheive你正在尋找的行爲,但這裏是去了解它VALUE_LIST和使用查詢集API的一種方法排除:

user_list = [ 1, 3, 5] 

# gets you a qs 
rows_to_delete = Unread.objects.exclude(user__in=user_list) 
rows_to_delete.all().delete() 

# gets you a list 
users_in_unread = Unread.objects.value_list('user', flat=True) 
users_to_add = [ user for user in users_list if user not in users_in_unread ] 
0

您可以創建一個Model.object.create()功能的新對象。當我在某物上調用顯示器時,我也有類似的情況。如果那件事還不存在,我會捕捉異常,創建新對象,然後添加必要的新東西。例如,我將外鍵添加到剛剛還不存在的對象(我想這就是你要問的東西?)

因此,查詢您要查找的行,如果您找不到該對象,然後使用unread_variable = Model.object.create()創建該對象,然後使用unread_variable添加您需要添加的任何內容,例如用戶。

Here是一些django關於這個主題的例子的鏈接。