【发布时间】:2021-05-13 20:34:09
【问题描述】:
问题: 如何通过 Django Admin 接口动态地将所选模型实例的关系添加到任何其他 Django 模型?
说明:
我想通过 Django 管理界面创建Categories。每个Category 都有多个Choices 分配给它。来自给定Category 的Choice(s) 只能分配给另一个特定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和category_name = 'Genre'有三种可能Choices:choice_name = 'biography',choice_name = 'thriller'和choice_name = 'poetry'。Category和category_name = 'Animal type'有两种可能Choices:choice_name = 'mammal'和choice_name = 'reptile'. -
Book类可能具有来自Category的Choices之一category_name = 'Genre'已分配。但是,Choices与category_name = 'Animal type'不能分配给类Book。类比
Animal只能有Choices相关category_name = 'Animal type'分配给它。
换句话说,在管理面板中,例如Book 类的实例,我希望有一种方法可以从Categories 中选择适合Book 类的Choice 对象。
我想这样做的原因是,使用 Django 管理界面的用户可以将可能的类别动态添加到所选模型(例如,添加 Category category_name = "Conservation status" 可用于类 Animal),如果需要,可以向类别添加更多选项(例如,将另一个 choice_name = 'fish' 添加到 category_name = 'Animal type'。这样对于最终管理员用户来说非常灵活,无需更改代码中的任何内容。
我尝试使用泛型关系来实现它 - 但是,它并不成功,因为 AFAIK 泛型关系将给定对象(例如 Category)与任何其他类的 对象实例 联系在一起,而不是一般到任何其他类(因此,在使用通用关系时,对于Category,我必须指定与给定Book 对象实例的关系,而不是一般Book 类)。
我想知道这样的行动是否可行 - 我搜索了很多,但找不到任何东西。也许有更简单的方法?提前谢谢!
【问题讨论】:
-
Choice和Category是什么,它们是否扩展了models.Model? -
@Alex 是的,他们有。编辑了问题。谢谢
-
“选择”一词需要改进。在您使用它的上下文中,它实际上并没有任何意义,而且由于 Django 的
ChoiceField,它会让人感到困惑。为这些实体寻找更好的名称是一种哲学练习,但一个快速的想法是使用CategoryType来表示您一直称为“类别”的内容,使用Category来表示您一直称为“选择”的内容。 -
"这种方式对最终管理员用户来说非常灵活,无需更改任何代码。"然而,对我来说,它看起来像是过早的优化和 YAGNI。我也怀疑如果用户无法定义新实体(
ModelWithChoosableFields子类;顺便说一句,ModelWithChoosableFields也需要一个更好的名称)会有多大用处。虽然ChoiceField 可能会对您有所帮助,但我相信您正在寻找的东西并不是开箱即用的。 -
category和您的每个模型之间的多对多关系如何?管理员可以从管理面板中选择分配给每个Book或Animal的类别,并且由于选择与类别相关,Animals 和Books 将通过这个多连接到他们的选择很多关系。
标签: python django django-models django-admin