1. ホーム
  2. django

Django の GenericForeignKey をモデルのリストに制限するにはどうすれば良いですか?

2023-10-16 16:48:39

質問

contenttypes GenericForeignKey を持つモデルが、定義済みのリストからしかモデルを指さないように、django に指示する方法はありますか?例えば、私は 4 つのモデルを持っています。A, B, C, D と GenericForeignKey を持つモデル X です。Xに、GenericForeignKeyはA & Bのみ使用可能であると伝えることはできますか?

どのように解決するのですか?

例えば、以下のような場合です。 アプリはappとapp2で、appにはA,Bモデル、app2にはC,Dモデルが存在します。 を表示させたい場合 app.A と app.B と app2.C

from django.db import models

class TaggedItem(models.Model):
    tag = models.SlugField()
    limit = models.Q(app_label = 'app', model = 'a') | models.Q(app_label = 'app', model = 'b') | models.Q(app_label = 'app2', model = 'c')
    content_type = models.ForeignKey(ContentType, limit_choices_to = limit)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

ForeignKeyにlimit_choices_toを使用します。

詳細は django docs を参照してください。また、Q オブジェクト、app_label も参照してください。 を使うには、適切な app_label とモデルを書く必要があります。これは単なるコードスニペットです。

plus: あなたは間違った app_label を書いていると思います。これはあなたの助けになります。

from django.contrib.contenttypes.models import ContentType
for c in ContentType.objects.all():
    print(c.app_label, c.model)