0

djangoに問題があり、頭を動かすことができません。2日間それを続けて、ソースを調べていましたが、説明が見つかりません。誰かが私よりもこれをよく知っていることを願っています!

私は2つのモデルを持っています、PublicationそしてArticleこのように

class Publication(models.Model):
    title = models.CharField(max_length=30)
    articles = models.ManyToManyField('Article',blank=True)

    class Meta:
        db_table = 'publications'

class Article(models.Model):
    headline = models.CharField(max_length=100)

    class Meta:
         db_table = 'articles'

新しいものを保存するときにPublication、デフォルトの記事を自動的に保存したいと思います。これをテストするためのスクリプトを実行しましたが、正常に動作します。両方のオブジェクトがそれぞれのテーブルに作成され、1つのエントリがpublications_articlesテーブルに書き込まれます。予想通り。

publication = Publication(title='The new exciting publication')
publication.save()
publication.articles.create(headline='The article that makes the pub so exciting')

ただし、ここで注意が必要な部分があります。管理者に保存するときに同じ機能を持つためにPublication、私はこのような機能をオーバーライドしましたsave_model()

class PublicationAdmin(admin.ModelAdmin):
    list_display = ['title']

    def save_model(self, request, obj, form, change):
        if not change:
            obj.save()
            obj.articles.create(headline='The article that makes this pub so exciting')
        else:
            obj.save() 

管理者にaを保存すると、とのPublication両方が作成されますが、それらを結び付けるエントリはテーブルにありません。PublicationArticlepublications_articles

誰かお願いします、この振る舞いを説明してください。私はそれをやり遂げるために生のsql-insertを実行しようとしていますが、エンティティ間の接続が確立されない理由を理解したいと思います。

4

1 に答える 1

0

の最後にあるコードをデバッグすると、直後に呼び出されるsave_modelことがわかります。このメソッドは、入力されたフォームに関連データが入力されていないかsave_relatedどうかをチェックします。記事はコードを介して追加されたため、テーブルPublication内のデータベースに値をコミットしません。publications_articles

オーバーライドされたsave_modelメソッドの最後に、1が返されることにも気付くでしょうがobj.articles.count()、この時点では値はテーブルに挿入されていません。

オーバーライドするのが最善かもしれませんsave_related

def save_related(self, request, form, formsets, change):
    form.save_m2m()
    for formset in formsets:
        self.save_formset(request, form, formset, change=change)

    if not change and not formsets 
        form.instance.articles.create(headline='The article that makes this pub so exciting')
于 2012-12-24T16:16:05.333 に答える