Python Django通用评论模型可用于不同的应用程序

Python Django通用评论模型可用于不同的应用程序,python,django,django-models,database-design,Python,Django,Django Models,Database Design,我正在创建一个项目,该项目需要在多个应用程序(如博客、维基、以及页面)中添加注释。我有一个commons应用程序,它包含所有常见的模型。我如何拥有所有应用程序都通用的注释模型 commons/models.py 类注释(models.Model): user=models.ForeignKey(用户,在_delete=models.CASCADE上,相关的_name='comments') body=models.TextField() parent=models.ForeignKey('sel

我正在创建一个项目,该项目需要在多个应用程序(如
博客
维基
、以及
页面
)中添加注释。我有一个
commons
应用程序,它包含所有常见的模型。我如何拥有所有应用程序都通用的
注释
模型

commons/models.py

类注释(models.Model):
user=models.ForeignKey(用户,在_delete=models.CASCADE上,相关的_name='comments')
body=models.TextField()
parent=models.ForeignKey('self',on_delete=models.CASCADE,null=True)
blog/models.py

class Post(models.Model):
user=models.ForeignKey(user,on_delete=models.CASCADE,related_name='posts')
content=models.TextField()
wiki/models.py

类Wiki(models.Model):
user=models.ForeignKey(用户,在_delete=models.CASCADE上,相关的_name='wikis')
content=models.TextField()
根据我的研究,我有以下选择

  • 三个
    Comment
    为三个应用程序建模
  • commons
    应用程序中的一个
    注释
    模型与其他应用程序具有外键关系(我认为这会导致循环导入问题),最后会出现一个注释表,其中包含多个列,如
    blog\u id
    wiki\u id
    ,以及
    page\u id
  • 使用Django的
    GenericForeignKey
    关系
  • 我不想做第三件事。但是,在1和2中,我想知道哪种方法是处理此问题的最有效方法,而不需要重复代码和添加不必要的数据库连接


    或者有更好的方法吗?

    你问这个问题已经有一段时间了,所以我想知道你得出了什么结论

    一个想法是在commons应用程序中创建一个抽象模型,然后在每个应用程序中创建特定于应用程序的子类。但是,这违反了可移植性原则,因为应用程序现在将依赖于commons应用程序

    这就是
    commons
    应用程序的问题所在,该应用程序将包含其他应用程序共享的所有模型。虽然我们可以考虑这一点来解决循环引用的问题,但它们只是一个更大的问题的症状,首先忽略了这个原则。制造进一步的分离只会让事情变得更糟

    在您的项目中,您似乎已经确定了3个独立的web应用程序,因此我认为答案应该是在每个应用程序中创建特定于应用程序的模型。。。即使它似乎违反了干式原则,因为它有利于便携性

    在我看来(这总是会发生变化),任何应用程序都不应该依赖于安装的模块和Django本身之外的任何东西。这确保了代码的可移植性和可重用性


    我这么说是因为我知道这可能会导致一个单片应用程序,但我觉得这比交叉依赖引起的循环引用更可取。唯一的解决方案是将核心功能剥离到可以包含在任何项目中的模块中。Django中包含的用户模块就是一个很好的例子。类似django simple history的东西将是另一个例子。两者都不依赖于您的代码。。。你的代码依赖于它们。

    你问这个问题已经有一段时间了,所以我想知道你得出了什么结论

    一个想法是在commons应用程序中创建一个抽象模型,然后在每个应用程序中创建特定于应用程序的子类。但是,这违反了可移植性原则,因为应用程序现在将依赖于commons应用程序

    这就是
    commons
    应用程序的问题所在,该应用程序将包含其他应用程序共享的所有模型。虽然我们可以考虑这一点来解决循环引用的问题,但它们只是一个更大的问题的症状,首先忽略了这个原则。制造进一步的分离只会让事情变得更糟

    在您的项目中,您似乎已经确定了3个独立的web应用程序,因此我认为答案应该是在每个应用程序中创建特定于应用程序的模型。。。即使它似乎违反了干式原则,因为它有利于便携性

    在我看来(这总是会发生变化),任何应用程序都不应该依赖于安装的模块和Django本身之外的任何东西。这确保了代码的可移植性和可重用性


    我这么说是因为我知道这可能会导致一个单片应用程序,但我觉得这比交叉依赖引起的循环引用更可取。唯一的解决方案是将核心功能剥离到可以包含在任何项目中的模块中。Django中包含的用户模块就是一个很好的例子。类似django simple history的东西将是另一个例子。两者都不依赖于您的代码。。。您的代码依赖于它们。

    我现在使用第一个选项。:)我已经在我的核心应用程序中创建了一个抽象模型,并在其他应用程序中对其进行了子类化。我现在使用的是第一个选项。:)我在我的核心应用程序中创建了一个抽象模型,并在其他应用程序中对其进行了子类化。