Django:一对多关系更新

时间:2011-03-19 03:30:26

标签: django django-models

我不确定如何正确描述。但我的模型看起来像这样:

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有“自动”方式吗?或者处理这些类型的场景的“推荐”方式是什么?

之前我曾经遇到过这个问题,我记得我处理这个问题的“最懒惰”的方法是删除未读模型中的所有内容,然后添加“用户列表”中的所有内容。

最诚挚的问候, w ^

2 个答案:

答案 0 :(得分:3)

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

可能有更好的方法来实现您正在寻找的行为,但是这里有一种方法可以使用values_list并使用queryset api exclude:

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 ]

答案 1 :(得分:0)

您可以使用Model.object.create()功能创建新对象。当我在某个东西上调用显示器时,我有类似的情况。如果那个东西还不存在,我会抓住异常,创建新对象,然后再添加必要的新东西。例如,我将外键添加到刚刚存在的对象中(我认为这是你要问的?)

因此,查询您要查找的行,如果找不到该对象,则使用unread_variable = Model.object.create()创建该对象,然后使用unread_variable添加您需要添加的内容,例如用户。

Here是关于该主题的一些django示例的链接。