7

对于具有特定关系的 Django 应用程序的数据库设计,我感到很困惑。我一直在查看以下数据库架构:http ://www.databaseanswers.org/data%5Fmodels/customers_and_orders/index.htm

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

我知道:

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

这是否等同于多对多关系?

  • 很多客户可以有很多地址?

当我在 django 中构建模型时,我有(简化):

class Customer_Address(models.Model):
    customer = models.ManyToManyField('inventory.Customer')
    address = models.ManyToManyField('inventory.Address')

这是正确的吗?或者这更有意义:

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

更新的问题:

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

基于以下内容: http ://en.wikipedia.org/wiki/Many-to-many_%28data_model%29

由于 Django 支持 ManyToManyFields,我什至不需要联结表吗?如果我确实使用联结表(Customer_addresses),这篇文章似乎暗示使用两个 OneToMany 关系,这不就是像这样的两个外键吗?

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

更新的问题:

现在我们知道 Django 构建了中间表,并且不需要 Customer_Addresses 表。哪个表应该有 ManyToManyfield?客户表?或地址表?

示例:https ://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

在 Person/Groups 示例中.. Groups 具有 ManyToManyField。是否有任何原因无法在 Person 表中定义 ManyToManyfield?

4

2 回答 2

8

总结一下

对于第一个问题。

当关系表明

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

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

比它显然是多对多关系并且总是使用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)

更多阅读

于 2012-12-15T18:55:58.313 回答
2

看来我没有足够的积分来回复评论。所以,回答你上面的问题:实际上没有区别。如Django 文档中的示例所示,您可以查询 Person 所属的 Groups 集以及属于 Group 的 Persons 集:

>>> 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>]
于 2013-06-04T20:36:39.980 回答