Python 在Django管理界面中设置与所选模型类的关系
问题: 如何通过Django管理界面将所选模型实例的关系动态添加到任何其他Django模型 说明: 我想通过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类别(模型)的对象。让我们展示一个伪代码示例:
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):
...
withCategory
有三种可能Category\u name='Genre'
:Choices
,Choices\u name='传记'
和Choices\u name='thriller'
choice\u name='poetry'
withCategory
有两种可能Category\u name='Animal type'
:Choices
和Choices\u name='哺乳动物'
Choices\u name='爬行动物'
- 类
可能有一个书籍
来自选项
类别
assigned。但是,category\u name='Genre'
与选项
不能分配给classcategory\u name='Animal type'
类似地,类Book
只能有与动物
分配给它category\u name='Animal type'
Book
的管理面板中,我想有一种方法来选择Choice
对象,这些对象来自Categories
,适合Book
类
我想这样做的原因是,使用Django管理界面的用户可以向所选模型动态添加可能的类别(例如,添加
类别类别
类别_name=“Conservation status”
choosable for classAnimal
),如果需要,为类别添加更多选项(例如,将另一个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相关