Django models 数据库设计多人、一人、多人、Django模型

Django models 数据库设计多人、一人、多人、Django模型,django-models,database-schema,Django Models,Database Schema,对于具有特定关系的Django应用程序的数据库设计,我感到困惑。我一直在研究以下数据库模式: 我对客户地址和客户以及地址之间的关系感到困惑 我知道: 一个客户可以有多个地址 许多客户可以有相同的(一)地址 这是否等同于多对多关系 许多客户可以有许多地址 在django中构建模型时,我已经(简化): 是这样吗?或者这更有意义: class Customer_Address(models.Model): customer = models.ForeignKeyField('inven

对于具有特定关系的Django应用程序的数据库设计,我感到困惑。我一直在研究以下数据库模式:

我对客户地址和客户以及地址之间的关系感到困惑

我知道:

  • 一个客户可以有多个地址
  • 许多客户可以有相同的(一)地址
这是否等同于多对多关系

  • 许多客户可以有许多地址
在django中构建模型时,我已经(简化):

是这样吗?或者这更有意义:

class Customer_Address(models.Model):
    customer = models.ForeignKeyField('inventory.Customer')
    address = models.ManyToManyField('inventory.Address')
更新问题:

基于这是一种多对多关系的想法。 一个多个关系是否需要两个多个字段

基于以下几点:

由于Django支持许多字段,我甚至不需要连接表吗? 如果我使用连接表(Customer_addresses),这篇文章似乎暗示使用两个OneToMany关系,这不就是像这样的两个外键吗

class Customer_Address(models.Model):
    customer = models.ForeignKeyField('inventory.Customer')
    address = models.ForgeinKeyField('inventory.Address')
更新问题:

现在我们知道Django构建了中间表,不需要表Customer_Addresses。哪张桌子应该有ManyToManyfield?顾客的桌子?还是地址表

例如:

在个人/团体示例中。。这些团体拥有许多领域。有什么原因不能在Person表中定义ManyToManyfield吗?

总之 第一个问题。

当一段关系表明

  • 一个客户可以有多个地址

  • 许多客户可以有相同的(一)地址

这显然是一种多对多的关系,总是使用ManyToManyField

现在开始第二个问题。

如果您想要一个中间表,它在两个多对多实体(表/模型)之间有额外的字段,该怎么办

然后创建一个新模型,其中包含来自其他两个模型的ForiegnKey。如

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

有关更多信息,我似乎没有足够的要点来回复评论。所以,回答你的问题:实际上没有区别。作为,您可以查询人员所属的组集以及属于组的人员集:

>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason= "Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all() # Get all Persons of a Group here
[<Person: Ringo Starr>]
>>> ringo.group_set.all() # Get all Groups for a Person here
[<Group: The Beatles>]
>>> m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason= "Wanted to form a band.")
>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]
>ringo=Person.objects.create(name=“ringo Starr”)
>>>paul=Person.objects.create(name=“paul McCartney”)
>>>披头士=Group.objects.create(name=“披头士”)
>>>m1=成员(个人=乐队,团体=披头士乐队,
…加入日期=日期(1962年8月16日),
…邀请\u reason=“需要一名新鼓手。”)
>>>m1.save()
>>>披头士乐队。成员。全体()#让所有人都到这里来
[]
>>>ringo.group_set.all()#在此处为一个人获取所有组
[]
>>>m2=成员资格。对象。创建(个人=保罗,团体=披头士,
…日期=日期(1960年8月1日),
…邀请_reason=“想要组建乐队。”)
>>>披头士乐队成员全部()
[, ]

如果在您的情况下,许多客户可以拥有相同的地址,那么这是一种多人关系。因此,第一种模式是可行的?是的,第一种模式适用于您。冒昧的风险,我认为你需要修改你的数据库基础知识,请阅读谢谢你的链接。我已经读过了,我想让我困惑的是关于很多领域的最后一句话。由于Django允许使用许多字段。。我不需要接线台吗?我将更新我的问题。我真的很抱歉遗漏了这一部分。实际上这是一个很好的问题。不,您不需要两个ManyToManyFields,Django后端处理所有事务。组模型获取ManyToMany字段有一个特殊的原因。为什么不让groups=models.ManyToManyfield(Group,through='Membership')。这会改变什么吗?
>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason= "Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all() # Get all Persons of a Group here
[<Person: Ringo Starr>]
>>> ringo.group_set.all() # Get all Groups for a Person here
[<Group: The Beatles>]
>>> m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason= "Wanted to form a band.")
>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]