正确使用ManyToMany为django中的复杂模型

时间:2016-06-22 23:17:07

标签: python django django-models

我的django app中有一个半复杂的模型关系。

我有一个可以拥有多个地点的集团(一个企业) 所以

一个团体也可以拥有许多提供者(人)。问题是,提供商通过组位置连接到特定组。也就是说,提供商可以拥有该位置。实际上,我相信提供商可以拥有多个位置(属于多个组)。到目前为止,我在我的django中的方式是这样的,我不这么认为是这样的:

class GroupLocations(models.Model):
    address_id = models.ForeignKey(Address, on_delete= models.SET_NULL)
    group_id = models.ForeignKey(Group, on_delete=models.SET_NULL)
    doing_business_as = models.CharField(max_length = 255)
    created_at=models.DateField(auto_now=false, auto_now_add=true)
    updated_at=models.DateField(auto_now=true, auto_now_add=true)

class ProviderLocations(models.Model):
    provider_id = models.ForeignKey(Provider, on_delete=models.CASCADE)
    group_location_id = models.ForeignKey(GroupLocations, on_delete=models.CASCADE)
    created_at=models.DateField(auto_now=false, auto_now_add=true)
    updated_at=models.DateField(auto_now=true, auto_now_add=true)

我的问题是,我的组(和/或提供者)模型是否需要在其模型定义中指定某种关系?

class Group(models.Model):
    group_name = models.CharField(max_length=50)
    group_contact= models.CharField(max_length=50)
    #do I need something like the following:
   providers = models.ManyToMany(Provider, through='ProviderLocations')
   provider_locations = models.ManyToMany(Group, through='GroupLocations'


class Provider(models.Model):
    created_at=models.DateField(auto_now=false, auto_now_add=true)
    updated_at=models.DateField(auto_now=true, auto_now_add=true)
    groups = models.ManyToManyField(Group, through='GroupLocations')
    group_locations = models.ManyToMany(GroupLocations, through='ProviderLocations')

这样我就可以从提供者和组位置获得一个组列表 我可以从一个组和提供者位置获得一个提供者列表。实际上更像是连接的位置。我仍在学习Django的关系系统,所以任何有关如何使这些关系很好地协同工作的建设性批评都会有所帮助。

1 个答案:

答案 0 :(得分:1)

  

我的问题是,我的群组(和/或提供商)模型是否需要   在他们的模型定义中指定了某种关系?

是多对多的关系。而且您只需要为一个模型或另一个模型定义它,因为可以在两个方向上遍历多个模型。

  

多对多关系的两端都可以自动访问API   另一端。 API就像“一对多”的“落后”一样   关系,上面。

     

唯一的区别在于属性命名:定义的模型   ManyToManyField使用该字段本身的属性名称,   而“反向”模型使用的是小写的模型名称   原始模型,加上'_set'(就像反向一对多   关系)。

来源:https://docs.djangoproject.com/en/dev/topics/db/queries/#many-to-many-relationships

因此,您的模型可以简化。

class Group(models.Model):
   group_name = models.CharField(max_length=50)
   group_contact= models.CharField(max_length=50)

   providers = models.ManyToMany(Provider, through='ProviderLocations')


class Provider(models.Model):
    created_at=models.DateField(auto_now=false, auto_now_add=true)
    updated_at=models.DateField(auto_now=true, auto_now_add=true)

我不太确定您为什么要创建GroupLocationProviderLocation模型。我相信他们可以合并。