2

.save() の前後のフィールド (manytomany) を比較して、どのエントリが削除されたかを知りたい。私が試してみました:

def save(self):
    differentiate_before_subscribed = Course.objects.get(id=self.id).subscribed.all()
    super(Course, self).save()  # Call the "real" save() method.
    differentiate_after_subscribed = Course.objects.get(id=self.id).subscribed.all()
        #Something

ただし、different_before_subscribed とdifferent_after_subscribed の値は同じです。信号を使用する必要がありますか? そしてどうやって?

編集 :

def addstudents(request, Course_id):
    editedcourse = Course.objects.get(id=Course_id)  # (The ID is in URL)

    # Use the model AssSubscribedForm
    form = AddSubscribedForm(instance=editedcourse)

    # Test if its a POST request
    if request.method == 'POST':
        # Assign to form all fields of the POST request
        form = AddSubscribedForm(request.POST, instance=editedcourse)
        if form.is_valid():
            # Save the course
            request = form.save()

            return redirect('Penelope.views.detailcourse', Course_id=Course_id)
    # Call the .html with informations to insert
   return render(request, 'addstudents.html', locals())

# The course model.
class Course(models.Model):
    subscribed = models.ManyToManyField(User, related_name='course_list', blank=True, null=True, limit_choices_to={'userprofile__status': 'student'})
4

1 に答える 1

2

モデル フォームを保存すると、まずインスタンスが保存され、次にメソッドsave_m2mが個別に呼び出されます (save_m2mでフォームを保存しない限り、 は自動的に呼び出されますcommit=False。この場合、手動で呼び出す必要があります)。多対多フィールドは後で保存されるため、両方のクエリ セットで同じ結果が得られます。

m2m_changedシグナルを使用して、多対多フィールドへの変更を追跡することができます。

最初の提案 (うまくいきませんでした):

Djangoクエリセットは遅延型です。この場合、最初のクエリセットはモデルが保存されるまで評価されないため、2 番目のクエリセットと同じ結果が返されます。

を使用して、クエリセットを強制的に評価できますlist

differentiate_before_subscribed = list(Course.objects.get(id=self.id).subscribed.all())
于 2012-07-26T21:54:12.177 に答える