我试图建立一个客户可以喜欢供应商和商店的关系,并在我的班级图表上(见下图)我有以下关系:
在第一个应用程序中,我有一个person对象,由供应商和客户端继承 在第二个应用程序中,我只有一个商店对象(与供应商有向后关系,但它没有在类图上显示,这就是第二个应用程序即时显示的原因)
问题是客户端与供应商有很多关系,而与存储有很多关系,但关系客户端/存储会产生错误,导致app2在应用1之后失效。
有没有办法制作通用的多种关系?
因为客户可以拥有许多供应商和许多商店,商店可以拥有许多客户,供应商可以拥有许多客户
我使用的代码:
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
我想在管理员中看到的内容很简单:
答案 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')