从其他应用程序导入模型 类 而不会导致 Django 中的循环引用

Importing model classes from other apps without causing circular reference in Django

我有 3 个应用程序产品、销售、购买。每个应用程序都有一个相应命名的模型 class、产品、销售和购买。

products/models.py
class Product(models.Model):
    Name = models.CharField(max_length=32)

sales/models.py
class Sale(models.Model):
    Product = models.ForeignKey('products.Product', on_delete=models.CASCADE)

purchases/models.py
class Purchase(models.Model):
    Product = models.ForeignKey('products.Product', on_delete=models.CASCADE)

我决定为模型 classes 创建自定义管理器,这样我就可以在模型文件中保留所有逻辑(通过覆盖每个 class 的对象属性)在自定义管理器中编写方法 我在 products.models 中导入了 Sale 模型,在 sales.models 中导入了 Product 模型,这创建了一个循环引用,我能够通过在方法本身中执行导入来摆脱它,但我记得在网上读到循环导入是代码编写错误的标志。

所以我的问题是如何在这种情况下避免循环导入并访问 sales.models 中的产品模型和 products.models 中的销售。

运行 进入循环导入意味着您正在与您创建的分离作斗争,或者您没有编写适当的解耦代码。就您而言,我认为您可能过于努力地将这些模型分离到单独的应用程序中。当然,销售和采购是同一组功能的一部分,并且共享许多业务逻辑。甚至产品也可以存在于同一个应用程序中,尽管您可能在那里有更多的争论。

如果您来自另一种语言,在这种语言中通常不会在单个文件中包含多个 类,您应该知道不是 python。请注意,在 Django 官方教程中,polls 应用程序在同一文件中同时包含 QuestionAnswer 模型。

我认为在同一个 models.py 文件中包含所有三个模型的名为 commerce 的单个应用程序是有意义的。

# commerce/models.py

class Product(models.Model):
    name = models.CharField(max_length=32)


class Sale(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)


class Purchase(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

您可以import a model by name避免循环导入。当你需要使用模型时,像这样导入:

from django.apps import apps

ModelName = apps.get_model(app_label='app_name', model_name='ModelName')