为我的django应用程序构建一些复杂的模型并在这里得到一些帮助:
Using ManyToMany through correctly for complex model in django
结果在这里得到了很多:
ipaswdb.ProviderLocations:(fields.E336)该模型用作 中间模型由' ipaswdb.Group.providers',但它没有 “' Group'的外键或者'提供商'。
我的意思是,错误是我的英语,但我不知道它真的想告诉我什么。
以下完整模型,但我们的想法是让A组拥有多个位置。
属于某个群组的提供者,无论他们在哪个位置工作,其次,提供者可以属于许多地方的许多群体
Provider A -> location 1
-> location 2
-> location 3
Group 1 -> has a location 1
-> has a location 2
Group 2 -> has a location 3
-> has a location 4
提供商A通过位置1,2,3
属于第1组和第2组我的完整型号是:
class Group(models.Model):
group_name = models.CharField(max_length=50)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
providers = models.ManyToManyField('Provider', through='ProviderLocations')
class Provider(models.Model):
first_name = models.CharField(max_length = 50)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
class ProviderLocations(models.Model):
provider = models.ForeignKey('Provider', on_delete=models.CASCADE)
group_location = models.ForeignKey('GroupLocations', on_delete=models.CASCADE)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
class GroupLocations(models.Model):
address = models.ForeignKey('Address', on_delete= models.SET_NULL, null=True)
group = models.ForeignKey('Group', on_delete=models.SET_NULL, null=True)
doing_business_as = models.CharField(max_length = 255)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
我也尝试在ProviderLocations上进行编辑而没有结果:
class ProviderLocations(models.Model):
provider = models.ForeignKey('Provider', on_delete=models.CASCADE)
group = models.ManyToManyField('Group', through='GroupLocations')
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
答案 0 :(得分:1)
设置中间模型时,显式指定外部模型 涉及多对多关系的模型的关键。 此显式声明定义了两个模型的相关性
Group
(不是GroupLocations
)和Provider
是M2M关系中的那些,因此通道模型ProviderLocations
必须与其ForeignKeys
相关联:
class ProviderLocations(models.Model):
provider = models.ForeignKey('Provider', on_delete=models.CASCADE)
group = models.ForeignKey('Group', on_delete=models.CASCADE)
按原样,每个提供程序都有一组组,每个组都有一组组位置,您可以遍历该层次结构来获取对象。
您可以通过取消ProviderLocations
模型并使用GroupLocations
作为通道模型,通过组位置使提供者成为组的一部分:
class Group(models.Model):
group_name = models.CharField(max_length=50)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
providers = models.ManyToManyField('Provider', through='GroupLocations')
class Provider(models.Model):
first_name = models.CharField(max_length = 50)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
class GroupLocations(models.Model):
provider = models.ForeignKey('Provider', on_delete=models.CASCADE)
group = models.ForeignKey('Group', on_delete=models.SET_NULL, null=True)
address = models.ForeignKey('Address', on_delete= models.SET_NULL, null=True)
doing_business_as = models.CharField(max_length = 255)
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)