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

Geo*_*Geo 60 django django-models django-forms django-admin django-contenttypes

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

mum*_*ino 110

例如,您的应用程序是app和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')
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

  • 我认为你写错app_label或模型.app_label和model必须是小写的.检查我的答案,我添加了一些更多的信息. (5认同)
  • 在 Django 2.2 上为我工作。这里需要注意的重要一点是,此限制/限制仅适用于 django admin 选择下拉列表/视图,它不会强制执行数据库约束。因此,尽管有“limit_choices_to”参数,您仍然可以通过代码分配不同的内容类型。您可以尝试重写“save”方法以在代码级别验证内容类型。 (2认同)
  • 为了清楚起见,我不会将限制变量与模型字段列表混为一谈。它可能应该位于列表上方,中间有一两行空行。 (2认同)