2

ContentTypes と Generic を使用する 3 つのモデルを持つ Django アプリを使用して、Task モデルがDjango で動的外部キーを使用する方法を使用して、他の 2 つのモデルのいずれかへの ForeignKey を持つことを許可しますか? ガイドとして(ただし、このアプローチで何が起こっているのかまったくわからないことは認めます)。

class Task(models.Model):
    date = models.DateTimeField(null = True)
    day = models.IntegerField(null = True)
    task = models.CharField(max_length = 100, null = False)
    owner = models.CharField(max_length = 25, null = True)
    notes = models.CharField(max_length = 250, null = True)
    isDone = models.BooleanField(default = False, null = False)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    maintenance = generic.GenericForeignKey('content_type', 'object_id')

class Maintenance(models.Model):
    startMonth = models.CharField(max_length = 15, null = False)
    startYear = models.IntegerField(null = False)
    location = models.CharField(max_length = 20, null = False)
    mode = models.CharField(max_length = 20, null = False)

    taskRef = generic.GenericRelation(Task)

class Template(models.Model):
    name = models.CharField(max_length = 25, null = False)
    location = models.CharField(max_length = 20, null = False)
    mode = models.CharField(max_length = 20, null = False)

    taskRef = generic.GenericRelation(Task)

通常、Task が Maintenance への通常の ForeignKey を持っている場合、Maintenance.task_set.all() を使用して特定の Maintenance に接続されたすべての Task を取得できますが、この動的外部キー システムではその機能は機能しません。この効果を達成するための代替関数呼び出しを知っている人はいますか?

4

1 に答える 1

1

user710907が言うように、 Maintenance.taskRef.all() はトリックを行う必要があります。ForeignKey 関係を指定する場合、逆の関係に使用される「related_name」引数を設定できます。指定しない場合、これはデフォルトで「model_name_set」になります。

class Foo(models.Model):
    ...

class Bar(models.Model):
    ...
    foo = models.ForeignKey(Foo, related_name="related_bars")

bar.fooこれで、一方から、または他方からその関係にアクセスできますfoo.related_bars。指定しない場合、後者の引数はデフォルトで になりますfoo.bar_set

あなたの例では、両側から関係を定義します。FK は Task で定義され、参照は Maintenance と Template で定義されます。リレーションシップを処理する両方のモデルにフィールドを提供したので、maintenance_set のデフォルトを提供する必要はありません。

編集:さらに調べてみると、混乱の一部はあなたの分野にあると思いますTask.maintenance。私が間違っていなければ、それはあなたがポイントしたいフィールドMaintenance または Templateですよね?では、なぜそれが呼ばれているのmaintenanceですか?ドキュメントのこのセクションも読むことをお勧めします。

于 2013-07-18T14:34:07.553 に答える