16

django シグナル ( http://docs.djangoproject.com/en/dev/topics/signals/ ) について読みましたが、私が理解している限り、シグナルは文字通りの SQL トリガーに変換されることはありません ( http://en.wikipedia. org/wiki/Database_trigger )。

シグナルとトリガーが異なるというのが正しければ、どちらが優れていて、どのような点で優れているのでしょうか? ベストプラクティスは何ですか?

...................................

必要な場合の具体的な例を次に示します。

class Location(models.Model):
    name = models.CharField(max_length=30)

class Person(models.Model):
    location = models.ForeignKey('Location')

class Team(models.Model):
    locations = models.ManyToManyField('Location')

その人の場所がそのチームの場所のセット内にある場合にのみ、その人がチームに参加できるようにしたいと考えています。通常のリレーショナル制約でそれを行う方法がわからないため、私が知る限り、トリガーまたはシグナルを使用することを余儀なくされています。私の直感は、トリガーを使用する必要があると言っていますが、ベストプラクティスを知りたいです。

4

4 に答える 4

22

ない。このジョブに最適なツールはモデルの検証です。そこにカスタム検証ルールを記述でき、管理者と独自のアプリで適用されます。

于 2010-08-21T22:03:30.247 に答える
12

Django シグナルは素晴らしいです (検証も素晴らしいですが、保存する前に何かを変更する必要がある場合もあります…)。Django を介してのみデータベースを操作している場合は、すべてのロジックを同じ場所に保持することをお勧めします。

これがどのように機能するかの例です:

class Example(models.Model):
    ''' Example of Model (I hate foo-bars!) '''
    age = models.IntegerField()
    can_buy_beer = models.BooleanField(default=False)


def set_can_buy_beer(sender, instance, **kwargs):
    ''' Trigger body '''
    if instance.age >= 21:
        instance.can_buy_beer = True
    else:
        instance.can_buy_beer = False

# ↓ Magic — now, field Example.can_buy_beer will be autocalculated on each save!
pre_save.connect(set_can_buy_beer, sender=Example) 
于 2012-01-25T13:27:24.910 に答える
4

シグナルに対するトリガーの主な利点:

  • アプリケーションに依存しない: 新しいフレームワーク/言語への移行を容易にします (トリガーと、場合によってはストアド プロシージャが DB にダンプされるため)

  • 安全性: 状況によっては、一部のテーブルの UPDATE 権限を制限してもアプリを実行できる場合があります (今後 10 年以内にどのエクスプロイトが発見されるかを知っている重要な履歴またはトランザクション テーブルを考えてみてください)。

  • アプリが DBMS に対処しなければならない要求の数を減らします (特に分散アーキテクチャのコンテキストで役立ちます)。

主な利点は次のとおりです。主な短所は、古い学校の SQL 構文に対処する必要があることです。

于 2018-12-14T20:35:26.643 に答える
4

トリガーを使用してこの種の制約を適用できますが、私はそれに依存しません。ダニエルがすでに言ったように、これは二次的な実施としてのみ行うことができ、主要な実施はモデルの検証です。

DBトリガーとDjangoシグナルに関しては、一般的なものとは異なります。それらが共有する唯一の共通点は、エンティティの変更時に両方が呼び出されることです。しかし、エンティティは大きく異なります。

トリガーはデータベース行の変更を監視するため、未加工の表形式データを操作します。トリガー コードは DBMS によって実行されます。

トリガーシグナルとは対照的に、ドメイン オブジェクトの変更を監視します。一般的なケースでは、Django のモデルはいくつかのテーブル行からのデータで構成されています (モデルの継承と関連するオブジェクトのサブセットを考慮してください)。シグナル コードは Django によって実行されます。

于 2010-08-21T22:25:16.687 に答える