2011-03-19 6 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) 

Моя проблема в том, что я пытаюсь ОБНОВЛЯТЬ непрочитанную модель. Допустим, в моем " список пользователей" У меня есть идентификаторы пользователя: [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 

Примечание: идентификатор автоинкремент.

Есть ли у «Django» «автоматический» способ сделать это? Или что такое «рекомендуемый» способ обработки этих типов сценариев?

Я столкнулся с этой проблемой несколько раз раньше, и я помню, что «самый ленивый» способ, которым я занимался, состоял в том, чтобы УДАЛИТЬ все в Непрочитанной модели, а затем ДОБАВИТЬ все из «списка пользователей».

С наилучшими пожеланиями, W

ответ

3

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

Там может быть лучше для того чтобы достигнуть поведение, которое вы ищете, но вот один из способов это сделать с value_list и использованием QuerySet апи исключающих:

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 по этому вопросу.

Смежные вопросы