Django多个关系超过2个应用程序

时间:2014-10-14 15:22:16

标签: python django django-models uml

我试图建立一个客户可以喜欢供应商和商店的关系,并在我的班级图表上(见下图)我有以下关系:

在第一个应用程序中,我有一个person对象,由供应商和客户端继承 在第二个应用程序中,我只有一个商店对象(与供应商有向后关系,但它没有在类图上显示,这就是第二个应用程序即时显示的原因)

问题是客户端与供应商有很多关系,而与存储有很多关系,但关系客户端/存储会产生错误,导致app2在应用1之后失效。

有没有办法制作通用的多种关系?

因为客户可以拥有许多供应商和许多商店,商店可以拥有许多客户,供应商可以拥有许多客户

class diagram

我使用的代码:

class Store(models.Model):
    name = models.CharField("Nome", max_length=100)
    description = models.CharField("Descrição", max_length=300)

    class Meta:
        app_label = 'store'

class Person(models.Model):
    first_name = models.CharField("Primeiro Nome", max_length=100)
    last_name = models.CharField("Ultimo Nome", max_length=100)

    class Meta:
        app_label = 'core'


class Vendor(Person):
    bio = models.TextField("Bio", max_length=300, blank=True)
    last_update = models.DateTimeField("Ultima Atualização", auto_now=True)

    class Meta:
        app_label = 'core'


class Client(Person):
    favorite_stores = models.ManyToManyField(Store)
    favorite_vendors = models.ManyToManyField(Vendor)

    class Meta:
        app_label = 'core'

此代码给出了以下错误:

self.models_module = import_module(models_module_name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/core/models.py", line 7, in <module>
    from store.models import Store
  File "/store/models.py", line 6, in <module>
    from core.models import Vendor

我想在管理员中看到的内容很简单: admin

2 个答案:

答案 0 :(得分:6)

只需添加两个ManyToMany关系,而不是导入&#34; Store&#34; model,直接使用字符串(避免循环依赖)

class Client(Person):
   favorite_stores = models.ManyToManyField('store.Store')
   favorite_vendors = models.ManyToManyField(Vendor)

答案 1 :(得分:2)

这里有两个错误。最明显的是你有一个循环依赖:一个模型导入另一个,导入第一个...你可以通过不导入模型,并通过字符串引用另一个来逃避这一点。

另一个错误是我在这里看到了很多。您不希望在客户端模型的两侧都使用ManyToMany。实际上,Client 商店和供应商之间多对多关系的链接表。因此,你实际上需要双方都使用ForeignKeys。

所以,客户应该是:

class Client(Person):
    favorite_stores = models.ForeignKey('core.Store')
    favorite_vendors = models.ManyToManyField('core.Vendor')