web-dev-qa-db-ja.com

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

Djangoに、コンテンツタイプGenericForeignKeyを持つモデルは、事前定義されたリストのモデルしかポイントできないことを伝える方法はありますか?たとえば、A、B、C、D、Aの4つのモデルがあります。 GenericForeignKeyを保持するモデルXです。GenericForeignKeyではAとBのみが許可されることをXに伝えることはできますか?

62
Geo

たとえば、アプリは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とモデルを記述する必要があります。これは単なるコードスニペットです。

プラス:あなたは間違ったapp_labelを書いたと思います。これはあなたを助けることができます。

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