如何将Django的GenericForeignKey限制为模型列表?

时间:2011-06-13 20:34:54

标签: django django-models django-forms django-admin django-contenttypes

有没有办法告诉django具有contenttypes GenericForeignKey的模型只能指向预定义列表中的模型?例如,我有4个模型:A,B,C,D和一个包含GenericForeignKey的模型X.我可以告诉X只有A& GenericForeignKey可以使用B吗?

1 个答案:

答案 0 :(得分:106)

例如, 你的应用程序是应用程序和app2,应用程序中有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)