Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django管理界面中设置与所选模型类的关系_Python_Django_Django Models_Django Admin - Fatal编程技术网

Python 在Django管理界面中设置与所选模型类的关系

Python 在Django管理界面中设置与所选模型类的关系,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,问题: 如何通过Django管理界面将所选模型实例的关系动态添加到任何其他Django模型 说明: 我想通过Django管理界面创建类别。每个类别都有多个选项来自给定类别的选项只能分配给另一个特定Django类别(模型)的对象。让我们展示一个伪代码示例: class Category(models.Model): category_name = models.CharField() class Choice(models.Model): category = models.F

问题: 如何通过Django管理界面将所选模型实例的关系动态添加到任何其他Django模型

说明:

我想通过Django管理界面创建
类别
。每个
类别
都有多个
选项
<代码>来自给定
类别的选项
只能分配给另一个特定Django类别(模型)的对象。让我们展示一个伪代码示例:

class Category(models.Model):
    category_name = models.CharField()


class Choice(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="choices")
    choice_name = models.CharField()


class ModelWithChoosableFields(models.Model):
    possible_categories = ...   # objects of class Category
    selected_choices = ...   # objects of class Choice

    class Meta:
        abstract = True


class Book(ModelWithChoosableFields):
    ...

class Animal(ModelWithChoosableFields):
    ...
  • Category
    with
    Category\u name='Genre'
    有三种可能
    Choices
    Choices\u name='传记'
    Choices\u name='thriller'
    choice\u name='poetry'

    Category
    with
    Category\u name='Animal type'
    有两种可能
    Choices
    Choices\u name='哺乳动物'
    Choices\u name='爬行动物'

  • 书籍
    可能有一个
    选项
    来自
    类别
    category\u name='Genre'
    assigned。但是,
    选项
    category\u name='Animal type'
    不能分配给class
    Book

    类似地,类
    动物
    只能有与
    category\u name='Animal type'
    分配给它

换句话说,在类
Book
的管理面板中,我想有一种方法来选择
Choice
对象,这些对象来自
Categories
,适合
Book


我想这样做的原因是,使用Django管理界面的用户可以向所选模型动态添加可能的类别(例如,添加
类别
类别
类别_name=“Conservation status”
choosable for class
Animal
),如果需要,为类别添加更多选项(例如,将另一个
choice\u name='fish'
添加到
category\u name='Animal type'
。这样,对于终端管理员用户来说非常灵活,无需更改代码中的任何内容

我尝试用泛型关系来实现它-但是,它没有成功,因为AFAIK泛型关系将给定的对象(例如,
类别
)绑定到任何其他类的对象实例,而不是任何其他类(因此,在使用泛型关系时,对于
Category
我必须指定与给定
Book
对象实例的关系,而不是通常与
Book
类的关系)

我想知道这样的操作是否可行-我搜索了很多,但什么也找不到。也许有更简单的方法?提前谢谢!

使用它,您可以将模型实例关联到整个模型类,而无需进行覆盖即可实现目标。 以下是如何做到这一点:

  • 在类别模型中,定义一个到ContentType的值。这样,在类别模型表单中,您可以选择此类别适用于哪些模型,并且可以根据其类别是否包含特定模型筛选选项。使用ManyToManyField的limit_Choices_to参数来限制ContentType choICE适用于具有正确app_标签的用户,当然不包括选项和类别型号

  • 从Book/Animal/Etc.模型添加到选择模型,并使用limit_choices_to参数将选择限制为仅与相应模型相关的类别

  • 然后,您的模型应该看起来像这样:

    来自django.db导入模型的
    
    def get_ContentTypes():
    appQ=models.Q(app_label='YourAppName')#更改app_label的值以匹配应用程序的名称
    modelIsCatQ=models.Q(model='category')
    modelIsChoice=models.Q(model='choice')
    返回appQ&~modelIsCatQ&~modelIsChoice
    类别(models.Model):
    类别名称=型号.CharField(最大长度=128)
    asigned_models=models.ManyToManyField(ContentType,limit_choices_to=get_ContentTypes)
    课程选择(models.Model):
    choice_name=models.CharField(最大长度=128)
    类别=模型.ForeignKey(类别,on_delete=模型.Model)
    动物类(模型、模型):
    选项=models.ManyToManyField(选项,限制选项到=models.Q(类别指定的\u模型\uu模型\uu开始与class='animal'))
    教材(models.Model):
    choices=models.ManyToManyField(Choice,limit\u choices\u to=models.Q(类别\u分配的\u模型\u模型\u开始与class='book'))
    
    啊,瞧,你看到了:

  • 创建/编辑类别时,您可以选择它应应用于哪些模型
  • 创建/编辑书籍/动物等时,只能看到相关选项

  • 什么是
    选择
    类别
    ,它们是否扩展了
    模型。模型
    ?@Alex是的,它们扩展了。编辑了问题。谢谢你术语“选择”需要改进。在您使用它的上下文中,它实际上并不意味着什么,而且由于Django的
    ChoiceField
    ,它会让人感到困惑。为这些实体找到更好的名称是一项哲学练习,但一个快速的方法是使用
    CategoryType
    来定义您所称的“类别”和
    Category
    ,您一直称之为“选择”。“这种方式对于终端管理员用户来说非常灵活,无需更改任何代码。”然而,对我来说,这看起来像是过早的优化和YAGNI。我也怀疑,如果用户不能定义新的实体,它会有多大用处(
    ModelWithChoosableFields
    子类;顺便说一句,
    ModelWithChoosableFields
    也需要更好的名称)。虽然可能会对您有所帮助,但我相信您正在寻找的并不是现成的。
    类别
    和您的每个模型之间的多对多关系如何?管理员可以从管理面板中选择将哪些类别分配给每本
    书籍
    动物
    ,因为选择与c相关