【问题标题】:How can I restrict Django's GenericForeignKey to a list of models?如何将 Django 的 GenericForeignKey 限制为模型列表?
【发布时间】:2011-09-14 05:25:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    例如, 您的应用程序是 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 文档以获取详细信息和 Q 对象 app_label。 您需要编写正确的 app_label 和模型。这只是代码 sn-p

    plus:我认为你写错了 app_label。这可以帮助你。

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

    【讨论】:

    • 但是,管理界面似乎没有使用这个,因为它是选择字段。这是为什么呢?
    • 在我的管理员上,添加限制后,GenericForeignKey 的选择中的选项消失了。我只剩下“---”了。您能否发布一张包含管理员选择的屏幕截图?
    • 我认为你写错了 app_label 或模型。 app_label 和 model 必须是小写的。检查我的答案,我添加了更多信息。
    • 在 Django 2.2 上为我工作。这里要注意的重要一点是,这种限制/限制仅适用于 django 管理员选择下拉菜单/视图,它不会强制执行数据库约束。因此,尽管有limit_choices_to 参数,您仍可以通过代码分配不同的内容类型。您可以尝试覆盖 save 方法以在代码级别验证内容类型。
    • 为了清楚起见,我不会将限制变量与模型字段列表混为一谈。它可能应该在列表上方,中间有一两个空行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2012-01-28
    • 2019-08-11
    • 1970-01-01
    • 2021-10-10
    • 2021-10-23
    相关资源
    最近更新 更多