gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:43:36 24 4
gpt4 key购买 nike

问题:
如何通过 Django Admin 界面动态添加从所选模型实例到任何其他 Django 模型的关系?
说明:
我要创建Categories通过 Django 管理界面。每个Category有多个 Choices分配给它。 Choice(s)从给定 Category只能分配给另一个特定 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):
...
  • Categorycategory_name = 'Genre'有三种可能Choices :choice_name = 'biography' , choice_name = 'thriller'choice_name = 'poetry' .Categorycategory_name = 'Animal type'有两种可能Choices :choice_name = 'mammal'choice_name = 'reptile' .
  • 类(class)Book可能有 Choices 之一来自 Categorycategory_name = 'Genre'分配。然而,Choices相关category_name = 'Animal type'不能分配给类 Book .
    类似地,类 Animal只能有 Choices相关category_name = 'Animal type'分配给它。

  • 换句话说,在管理面板中,例如类 Book我想要一种选择 Choice 的方法来自 Categories 的对象适用于 Book类(class)。
    我想这样做的原因是,使用 Django 管理界面的用户可以动态地将可能的类别添加到所选模型(例如添加 Category category_name = "Conservation status" 可用于类 Animal ),如果需要,向类别添加更多选择(例如添加另一个 choice_name = 'fish'category_name = 'Animal type' 。这样对于最终管理员用户来说非常灵活,无需更改代码中的任何内容。
    我尝试使用通用关系来实现它 - 但是,它没有成功,因为 AFAIK 通用关系将给定的对象(例如 Category)与 联系起来。对象实例 任何其他类别,一般不至 任何其他类别 (因此,当使用泛型关系时,对于 Category,我必须指定与给定的 Book 对象实例的关系,而不是一般的 Book 类)。
    我想知道这样的行动是否可行 - 我搜索了很多但找不到任何东西。也许有更简单的方法?先感谢您!

    最佳答案

    ContentTypes您可以将模型实例与整个模型类相关联,无需覆盖即可实现您的目标。
    这是如何做到的:

  • 在您的类别模型中定义一个 many-to-many relationship到内容类型。这样,在您的类别模型表单中,您将能够选择该类别适用于哪些模型,并且您将能够根据其类别是否包含特定模型来过滤选项。使用 ManyToManyField 的 limit_choices_to 参数将 ContentType 选择限制为具有正确 app_label 的那些,当然排除 Choice 和 Category 模型。
  • 从书/动物/等。型号添加 many-to-many relationships选择模型并使用 limit_choices_to 参数将选择限制为仅具有与相应模型相关的类别的选择。

  • 你的模型应该看起来像这样:
    from django.db import models


    def get_ContentTypes():
    appQ = models.Q(app_label='YourAppName') #change value of app_label to match your app's name
    modelIsCatQ = models.Q(model='category')
    modelIsChoice = models.Q(model='choice')
    return appQ & ~modelIsCatQ & ~modelIsChoice

    class Category(models.Model):
    category_name = models.CharField(max_length=128)
    asigned_models = models.ManyToManyField(ContentType,limit_choices_to=get_ContentTypes)

    class Choice(models.Model):
    choice_name = models.CharField(max_length=128)
    category = models.ForeignKey(Category,on_delete=models.Model)

    class Animal(models.Model):
    choices = models.ManyToManyField(Choice,limit_choices_to=models.Q(category_assigned_models__model__startswith='animal'))

    class Book(models.Model):
    choices = models.ManyToManyField(Choice,limit_choices_to=models.Q(category_assigned_models__model__startswith='book'))

    Aaand 瞧。你有它:
  • 创建/编辑类别时,您可以选择它应该应用于哪些模型
  • 创建/编辑书籍/动物/等时。你只能看到相关的选择。
  • 关于python - 在 Django 管理界面中设置与所选模型类的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67525900/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com