Python Django circular Dependency ForeignKey vs ManyToManyField

Python Django circular Dependency ForeignKey vs ManyToManyField,python,django,Python,Django,对于一个项目,我有几个Django应用程序。 目标是公司或联系人可以包含无限数量的联系信息。(电话、电子邮件、地址) 我认为创建一个核心应用程序是一个不错的选择,我可以在其中放置手机、地址、语言、国家等型号。 我想把它们放在一个核心应用程序中,因为它们将在考虑项目的几个应用程序中使用 第二,我有一个联系人管理应用程序,里面有模特公司和联系人 这就是它看起来的样子 core/models.py 联系_管理/models.py 这导致循环依赖,错误无法导入语言 所以在那之后,我开始使用许多字段,这样

对于一个项目,我有几个Django应用程序。 目标是公司或联系人可以包含无限数量的联系信息。(电话、电子邮件、地址)

我认为创建一个
核心
应用程序是一个不错的选择,我可以在其中放置手机、地址、语言、国家等型号。
我想把它们放在一个
核心
应用程序中,因为它们将在考虑项目的几个应用程序中使用

第二,我有一个联系人管理应用程序,里面有模特公司和联系人

这就是它看起来的样子

core/models.py 联系_管理/models.py 这导致循环依赖,错误
无法导入语言

所以在那之后,我开始使用许多字段,这样我就可以反转依赖关系

core/models.py 联系_管理/models.py 这可能会起作用,但管理员不允许我在管理员中使用
表格行
来显示详细信息,或让我更新联系人或公司表单中的字段

另外,我并不真的喜欢ManyToManyField,因为每个联系人信息实例(电话、电子邮件)只有一个联系人或公司

联系管理层/管理员
也许这只是我在这里缺少的一个细节,或者我应该遵循另一种设计模式。我希望有人能帮我解决这个问题

您经常会遇到这些问题,这是因为您在
安装的应用程序中的顺序,或者您的帖子中的特定情况

在这种情况下,Django建议如下():

如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身

要引用在另一个应用程序中定义的模型,可以显式指定带有完整应用程序标签的模型

在解决两个应用程序之间的循环导入依赖关系时,这种引用非常有用

因此,您可以使用
“core.Language”
,而不是使用
语言:

class Contact(models.Model):
    name = models.Charfield(max_length=255)
    language = models.ForeignKey('core.Language')
这里,
core
app\u标签
Language
是模型类名


我建议您使用此完整的应用程序标签(字符串版本)来定义相关字段,如
ForeignKey
ManyToMany
等。所以你永远不会遇到这些问题。

你经常会遇到这些问题,因为你在
中安装的应用程序的顺序,或者你的帖子中的特定情况

在这种情况下,Django建议如下():

如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身

要引用在另一个应用程序中定义的模型,可以显式指定带有完整应用程序标签的模型

在解决两个应用程序之间的循环导入依赖关系时,这种引用非常有用

因此,您可以使用
“core.Language”
,而不是使用
语言:

class Contact(models.Model):
    name = models.Charfield(max_length=255)
    language = models.ForeignKey('core.Language')
这里,
core
app\u标签
Language
是模型类名


我建议您使用此完整的应用程序标签(字符串版本)来定义相关字段,如
ForeignKey
ManyToMany
等。因此,您永远不会遇到这些问题。

正确的解决方案,但问题与已安装应用程序中的顺序无关。是的,此问题与此无关,但如果顺序不同,您可以解决。正确的解决方案,但问题与已安装应用程序中的顺序无关。是的,此问题与此无关,但如果顺序不同,您可以使用它。
class Language(models.Model):
    name = models.CharField(max_length=100)

class Phone(models.Model):
    number = models.CharField(max_length=25)
from core.models import Language

class Company(models.Model):
    name = models.CharField(max_length=255)
    phone_numbers = models.ManyToManyField(Phone, blank=True, null=True)

class Contact(models.Model):
    name = models.Charfield(max_length=255)
    language = models.ForeignKey(Language)
    phone_numbers = models.ManyToManyField(Phone, blank=True, null=True)
class CompanyPhoneInline(admin.TabularInline):
    model = Company.phone_numbers.through

@admin.site.register(Phone)
class CompanyAdmin(admin.ModelAdmin):
    fields = ["company_name", "bank_account_number", "tax_id",
              "chamber_of_commerce_id", "active"]
    inlines = [CompanyPhoneInline, ]
class Contact(models.Model):
    name = models.Charfield(max_length=255)
    language = models.ForeignKey('core.Language')