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