【问题标题】:Django model class that can either have one relationship or another?可以有一种关系或另一种关系的 Django 模型类?
【发布时间】:2011-08-05 16:56:30
【问题描述】:

为了让您了解我正在尝试解决的问题,我将使用一个示例。问题是类之间可能存在多种可能的关系,以及如何在模型文件中表示这种关系。在购物网站中,部门可以有子部门或类别关系。这在理论上意味着一个部门可以有 100 个子部门,直到它有一个类别。

例如部门/类别/项目、部门/部门/类别/类别/项目、部门/类别/类别/项目...等

我的问题是如何最好地在 Django models.py 文件中描述这种关系?你会只有两个外键,一个是空的吗?

【问题讨论】:

    标签: django django-models relationships object-relationships


    【解决方案1】:

    我会在您的 Category 和 Department 模型上创建一个父属性,以便您可以表示层次结构。

    您可以在 Department 模型上使用 ForeignKey 以允许它们指向其他 Department,并且您可以在 Category 模型上使用 GenericKey 以使其指向 Departments 或其他类别。例如:

    class Department(models.Model):
        ...
        parent = models.ForeignKey('self', ...)
    
    class Category(models.Model):
        ...
        parent_content_type = models.ForeignKey(ContentType)
        parent_id           = models.PositiveIntegerField()
        parent              = generic.GenericForeignKey('parent_content_type', 'parent_id')
    

    这将允许您在任意部门树下表示任意类别树。

    【讨论】:

    • 完美,看起来通用外键就是我想要的!谢谢:)
    【解决方案2】:

    您可以使用 django 树实现 django-mpttdjango-treebeard

    【讨论】:

    • 我看过 django-mptt。看起来它在使用模板和视图时很有帮助。虽然我不确定这将如何解决具有指向两个不同类、部门或类别之一的外键的问题。据我所知,您在使用 mptt 时需要将这些组合在一起。
    猜你喜欢
    • 2022-08-18
    • 2011-08-10
    • 1970-01-01
    • 2016-11-30
    • 2021-04-13
    • 2013-10-22
    • 2021-03-12
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多