2016-05-12 14 views
1

私のdjangoプロジェクトでは、複数の主キーを持つテーブルを持つレガシーデータベースで作業しています。いくつかのモデルインスタンスでsave()メソッドを呼び出すと、Django ORMがSQLクエリを正しく構成しないという問題に直面しています。例えばdjangoプロジェクトの複数の主キーとレガシーデータベース

、私は次のモデルがあります:

class MyTable(models.Model): 
    field_1 = models.IntegerField(primary_key=True) 
    field_2 = models.BooleanField(default=False, null=False) 
    field_3 = models.BooleanField(default=False, null=False) 
    user = models.ForeignKey(
     CustomUser, models.DO_NOTHING, db_column='userid', primary_key=True) 

    class Meta: 
     managed = False 
     db_table = 'my_table' 
     unique_together = (('user', 'field_1'),) 

私はそのようなモデルのインスタンスを取得します:mytable_instance = MyTable.objects.all()[0]を。それから私は、そのインスタンスを変更したい:

mytable_instance.field_2 = True 
mytable_instance.field_2.save() 

しかし、DjangoのORMは、このクエリを実行します:

それは my_table内のすべての行のために field_2field_3のための新しい値を設定しますので、正しくない
{'sql': 'UPDATE `my_table` SET `field_2` = 1, `field_3` = 0 WHERE `my_table`.`field_1` = 123', 'time': '0.000'} 

field_1 = 123

どうすれば問題を解決できますか?

'UPDATE `my_table` SET `field_2` = 1, `field_3` = 0 WHERE `my_table`.`field_1` = 123 AND `my_table`.`user_id` = 1' 

EDIT:私はこのようなSQLクエリー必要な全コードを

レガシーデータベーステーブルのモデル:

class MyTable(models.Model): 
    field1_id = models.IntegerField(db_column='field1id', primary_key=True) 
    is_favorite = models.BooleanField(db_column='isfavorite', default=False, null=False) 
    is_admin = models.BooleanField(db_column='isadmin', default=False, null=False) 
    role = models.IntegerField(default=USER_GUEST, null=False) 
    field2 = models.BooleanField(null=False, default=True) 
    field3 = models.BooleanField(null=False, default=True) 
    is_active = models.BooleanField(db_column='isactive', null=False, default=True) 

    user = models.ForeignKey(
     CustomUser, models.DO_NOTHING, db_column='userid', primary_key=True) 

    DB_NAME = 'default' 

    class Meta: 
     managed = False 
     db_table = 'mytable' 
     unique_together = (('user', 'field1_id'),) 

クエリ:

>>> from web_services.apps.my_app.models import MyTable 
>>> g = MyTable.objects.get(field1_id=12) 
>>> g.is_active = True 
>>> g.save() 
>>> connection.queries[-1] 
{'time': '0.000', 'sql': 'UPDATE `mytable` SET `isfavorite` = 0, `isadmin` = 1, `role` = 3, `field2` = 1, `field3` = 1, `isactive` = 1 WHERE `mytable`.`field1id` = 12'} 

しかし、私は必要:

{'time': '0.000', 'sql': 'UPDATE `mytable` SET `isfavorite` = 0, `isadmin` = 1, `role` = 3, `field2` = 1, `field3` = 1, `isactive` = 1 WHERE `mytable`.`field1id` = 12' AND `mytable`.`userid` = 1'} 
+0

これはほとんど考えられません。あなたの完全なコードを投稿してください、私はそこにこれにつながるあなたのコードにいくつかの問題があると思う。 – e4c5

+0

@ e4c5上記のアップデートを追加しました。ありがとうございます! – AmirM

答えて

1

はのは、これらの2つのクエリを見てみましょう:

UPDATE `mytable` 
SET `isfavorite` = 0, `isadmin` = 1, `role` = 3, `field2` = 1, `field3` = 1, `isactive` = 1 
WHERE `mytable`.`field1id` = 12 

そして

UPDATE `mytable` 
SET `isfavorite` = 0,`isadmin` = 1, `role` = 3, `field2` = 1, `field3` = 1, `isactive` = 1 
WHERE `mytable`.`field1id` = 12' AND `mytable`.`userid` = 1 

2間の唯一の違いはAND userid=1ビットです。

それは確かに正しいあなたが

ことを言うとき、それはそのような行が正確にあり12

= field1_idと MY_TABLE内のすべての行のためにfield_2とfield_3のための新しい値を設定します。どうして? field_idを主キーと定義しているためです。これにより、field1_id = N(Nは任意の整数)の行が1つだけ存在することが保証されます。

したがって、djangoクエリは完全に動作しています。

+0

問題は、それがレガシーデータベースであり、 '(field1_id、user)'、 '(12,1)'、 '(12,2)'、 '(12,3)'、 '' (2、1) '、'(3、1) 'などのように、' 'mytable ''で。(12,2) '、'(12,3) 'を更新します – AmirM

+0

私の質問はおそらく複合キーを設定する方法でしょうか? – AmirM

+0

あなたが投稿したモデルには該当しません。 **は(12、1)、(12,2)、(12、3)** – e4c5

関連する問題