2011-03-19 104 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关于这个主题的例子的链接。