13

奇妙な問題が発生しています。ここの誰かが光を当ててくれることを願っています。

super() を実行した後、モデルの save() メソッドをオーバーライドして、ManyToMany フィールドにいくつかの値を追加しています。私の問題は、Django admin に保存すると、値が関係に追加されたように見えますが、再び空になることです。

しかし、私がそれを行うと、manage.py shell問題なく動作します。

そこに2つのprintステートメントを入れました.Django管理者またはシェルのどちらで実行しているかに関係なく、まったく同じ出力が生成されます.

class Store(models.Model):
    holidays = models.ManyToManyField(StoreHoliday, blank=True)
    copy_holidays_from = models.ForeignKey('Store', blank=True, null=True)

    def save(self):
        print '====  BEFORE SAVE:', self.holidays.all()
        super(Store, self).save()
        self.copy_holidays()
        print '====  AFTER SAVE:', self.holidays.all()

    def copy_holidays(self):
        if self.pk and self.copy_holidays_from:
            self.holidays.clear()
            for h in self.copy_holidays_from.holidays.all():
                self.holidays.add( h )

これは、printステートメントの出力です。

====  BEFORE SAVE: []
====  AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]

これを引き起こしている可能性のあるものについて何か提案はありますか?

編集: save() の m2m 関係へのすべての手動変更は、管理インターフェースを介して保存するときに Django によって破棄されるようです。これは、フォームの処理方法に関連していますか?

4

5 に答える 5

15

したがって、上記はそれを実装する正しい方法ではないことがわかりました。コードは、model_save() をオーバーライドすることにより、StoreAdmin に属していました。

これが私がそれを解決した方法です:

class StoreAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if obj.copy_holidays_from:
            form.cleaned_data['holidays'] = obj.copy_holidays_from.holidays.all()

        super(StoreAdmin, self).save_model(request, obj, form, change)
于 2011-06-01T11:33:14.583 に答える
3

私はおそらく今日、これと同じ動作に遭遇しました。そうです、それがdjangoがデータを処理する方法に関連していると仮定するのは正しいです。

django管理者は、実際のオブジェクトの変更とは別に、ManyToManyフィールドに変更を加えます。(m2mは別のデータベーステーブルに保存されることに注意してください)。

私の場合、管理サイトのManyToManyフィールドで何も選択しなかった場合、これは、ManyToManyリレーションのclear()操作に変換されます。save()メソッドで行うことはすべて、このクリアによってすぐに削除されます。post_saveシグナルハンドラーで行ったことと同じことです。

(私にとっての)解決策は、ManyToManyフィールドをインラインに分割して、オブジェクトを変更するときに自動的に空として保存されないようにすることでした。

于 2011-09-16T13:46:54.690 に答える