Обновление отношений M2M - PullRequest
0 голосов
/ 12 июня 2011

Есть ли способ напрямую обновить отношение M2M, кроме удаления старого_объекта и последующего добавления нового_объекта?

Это то, что мне сейчас нужно добавить новый объект -

if 'Add School' in request.POST.values():     
    form = EducationForm(request.POST)
    if form.is_valid and request.POST['school']:
         school_object = form.save()
         profile.educations.add(school_object)
         profile.save()
         return redirect('edit_education')

И вот что я пытаюсь сделать -

if 'Save Changes' in request.POST.values():
    form = EducationForm(request.POST)
    if form.is_valid and request.POST['school']:
         new_school_object = form.save(commit=False)    
         old_school_object = Education.objects.get(id = request.post['id']) 
         # profile.educations.get(old_school_object).update(new_school_object) # ?
         profile.save()
         return redirect('edit_education')

А вот мои модели -

class Education(models.Model):
    school = models.CharField(max_length=100)
    class_year = models.IntegerField(max_length=4, blank=True, null=True, choices=YEAR)
    degree = models.CharField(max_length=100, blank=True, null=True)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    ...
    educations = models.ManyToManyField(Education)

1 Ответ

1 голос
/ 13 июня 2011

Education, вероятно, является чем-то личным для одного UserProfile, поэтому вы должны использовать ForeignKey вместо M2M:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    ...

class Education(models.Model):
    user_profile = models.ForeignKey(UserProfile)
    school = models.CharField(max_length=100)
    class_year = models.IntegerField(max_length=4, blank=True, null=True, choices=YEAR)
    degree = models.CharField(max_length=100, blank=True, null=True)

(и дополнительно использовать наборы форм модели: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets)

Если Education фактически является общим для пользователей, один пользователь не должен иметь возможности изменять / обновлять его, поскольку другие пользователи также используют его!рассмотрим пользователей Алису и Боба, которые оба учатся на бакалавра в классе USC 2011 года. Если Алиса изменит это на MA, обучение Боба тоже изменится!и в ваших if s проверьте вместо клавиш «сохранить» или «добавить».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...