4

マルチテーブル継承を使用する 2 つのモデルがあります。

# models.py - psuedo-ish code for illustrative purposes

class BaseModel(models.Model):
    name = models.CharField()


class SubclassModel(BaseModel):
    subclass_attr = models.CharField()

SubclassModel の既存のインスタンスを更新するために必要なデータベース クエリの数をテストしています。カウントは、変更される属性が BaseModel で定義されているか、SubclassModel で定義されているかによって異なるようです。debugsqlshell を使用すると、次のようになります。

-- sm is an existing instance of SubclassModel, which has already been saved
-- Note that I'm updating an attribute defined in the BaseModel
>>> sm.name = "Name"
>>> sm.save()
SELECT (1) AS `a`
FROM `app_basemodel`
WHERE `app_basemodel`.`id` = 3 LIMIT 1  [0.40ms]

UPDATE `app_basemodel`
SET `name` = 'Name'
WHERE `app_basemodel`.`id` = 3  [0.34ms]

SELECT (1) AS `a`
FROM `app_subclassmodel`
WHERE `app_subclassmodel`.`basemodel_ptr_id` = 3 LIMIT 1  [0.33ms]

UPDATE `app_subclassmodel`
SET `subclass_attr` = 'something'
WHERE `app_subclassmodel`.`basemodel_ptr_id` = 3  [0.33ms]

私には、それは 4 つのクエリ (SELECT、UPDATE、SELECT、UPDATE) のように見えます。ただし、assertNumQueries3に設定すると、ユニットテストでのみパスします:

with self.assertNumQueries(3):
    # update a BaseModel attribute
    sm.name = "Different Name"
    sm.save()

奇妙なことに、SubclassModel で定義されている属性を更新すると、SQL はまったく同じように見えますが、assertNumQueries(4)パスします。

SQLite と MySQL でテスト スイートを実行するときの動作は同じです。

4

0 に答える 0