2017-10-06 17 views
-2

私は2つのDjangoモデル、ModelAModelBを持っています。後者には、前者との外部キーのリンクがあります。Djangoモデルのインスタンスが保存されているかどうか

class ModelA(models.Model): 
    item = models.BooleanField(default=True) 

class ModelB(models.Model): 
    modela = models.ForeignKey(ModelA) 
    answer = models.SmallIntegerField(null=True, blank=True) 

生産コードでは、ModelAのインスタンスが保存されます。同じ機能の間に、ModelBのインスタンスを自動的に保存するように見えますが、これはテンプレートでアクセスされるためです。まず

def view(request): 

    a = ModelA() 
    a.item = True 
    a.save() 

    b = ModelB.objects.filter(modela_id=a.id) 

    return render(request, 'template.html', context=locals()) 

、これは私はコードが仕事をしたいかですが、私はModelBのインスタンスが保存されているかどうかはわかりませんよ。 (これは継承されたコードです - 私はコードベース内のどこにいても、信号を見つけたり、ModelBを呼び出すことができません。

第2に、この動作はローカル開発では機能しなくなりました(ただし、同一のコードを使用しています)。 ModelBは保存されないため、bNoneを返します。私はコードの古い枝が同じ問題を抱えているので、コードの問題ではないと確信しています。私はローカルデータベースを以前のバージョンに復元しようとしましたが、無駄です。最近変更されたのは、移行ファイルの負荷が急増したことだけです。

誰でもこれらの質問にお答えできますか?私はDjango 1.11を実行しています。

+0

ModelBインスタンスを保存するコードが見つからない場合は、コードへのアクセスが制限されていると思いますか? – hspandher

+1

コードで、ModelBは決して存在しません。フィルタクエリは空でなければなりません。 ModelAを作成して保存し、ModelAにリンクするModelBインスタンスを検索するフィルタ条件でModelBのみを検索します。これは、ModelAにリンクしているModelBインスタンスを作成して保存するModelAにpost_saveハンドラがある場合にのみ機能します。 これが本番環境で動作する理由:表示される実動コードが、システムの導入時に実行されたものと同じであることを確認してください。再起動しなければ、プロダクションサーバーで使用されているファイルより新しい* .pyファイルが表示されることがあります。 – ingofreyer

+1

申し訳ありませんが、これは絶望的に掲載されました。あなたは完全に正しいです@ingofreyer - 私は問題がMySQLデータベースでこの動作のトリガーがあることがわかった - トリガーは、ローカルデータベースへのコピーから逃していた。これが起こっていると言うコードにはまったく何もありません! – qmsack

答えて

0

コメントは正しかったので、ここでの質問への答えです:あなたは私たちを与えたコードで

は、ModelBは存在してはいけませんし、あなたのフィルタークエリが空でなければなりません。 ModelAを作成して保存し、ModelAにリンクするModelBインスタンスを検索するフィルタ条件でModelBのみを検索します。

これは、ModelAにリンクしてModelAにリンクするPost_saveハンドラをModelAに作成して保存している場合にのみ機能します。

これが本番環境で動作する理由:これは、現在の* .pyファイルを置き換える新しいコードによって発生する可能性がありますが、サーバーの再起動はまだ発生していません。この質問の著者が見つけたので、ModelBインスタンスを作成する場所にMySQLトリガーがありました。このトリガは開発システムでは使用できませんでした。

関連する問題