【问题标题】:When to use ManyToOne and ManyToMany relationships何时使用 ManyToOne 和 ManyToMany 关系
【发布时间】:2013-04-23 21:40:36
【问题描述】:

以下是大学及其评级的数据库。以下是我的想法

  1. 每个班级(批次,例如:2009 年批次)属于一个部门
  2. 每个系(例如:药学系)都属于一个学院

因为我特别关心评级。我想对批次进行评分,通过使用经理或某种模型方法,我可以计算部门或学院的总评分。

  1. 每个班级都有评级

注意:不同用户可能对一个班级有多个评分。所以,我想总评分或平均评分应该通过一种方法来完成!

这就是我目前所做的

class Rating(models.Model):
    positive = models.FloatField(default=0)
    negative = models.FloatField(default=0)

class College(models.Model):
    name = models.CharField(max_length=200)
    website = models.URLField()

class Department(models.Model):
    name = models.CharField(max_length=200)
    college = models.ForeignKey(College)

class Batch(models.Model):
    passout_year = models.IntegerField(max_length=4)
    department = models.ForeignKey(Department)
    rating = models.ForeignKey(Rating)

这个架构有一些问题!

  • 每个批次只能有一个评级!但是,我正在寻找由许多用户签名的多个评级(尽管尚未集成用户模型)

  • 每个批次属于一个部门,每个部门属于一个学院。但是,我们也可以换一种方式来考虑关系

  • 每个学院有很多系,每个系有很多批次,而..每个批次有很多系(例如:2009年可能有很多系),每个系可以在很多学院

那么,我应该使用 ManyToManyField 而不是 ForeignKey?

我的架构应该是什么样子?

我认为最重要的变化之一是

class Rating(models.Model):
    ..
    ..
    user = models.ForeignKey(django.contrib.auth.models.User)

class College(models.Model):
    ..
    ..
    departments = models.ManyToManyField(Department)

class Department(models.Model):
    ..
    college = models.ForeignKey(College)
    batches = models.ManyToManyField(Batch)

class Batch(models.Model):
    ..
    department = models.ForeignKey(Department)
    rating = models.ManyToMany(Rating)

这是对的吗?如果不是应该怎么看

谢谢

【问题讨论】:

    标签: python django-models many-to-many relational-database foreign-key-relationship


    【解决方案1】:

    这里是:

    from django.contrib.auth.models import User#First import user
    lass Rating(models.Model):
        ..
        ..
        user = models.ForeignKey(User)
    
    class College(models.Model):
        ..
        ..
        departments = models.ManyToManyField(Department)
    
    class Department(models.Model):
        ..
        college = models.ForeignKey(College)
        batches = models.ManyToManyField(Batch)
    
    class Batch(models.Model):
        ..
        department = models.ForeignKey(Department)
        rating = models.ManyToMany(Rating)
    

    当你建立多对多关系时,Django 会自动创建一个桥实体。

    【讨论】:

    • 这就是我在回答中提到的(下).. 对吗?
    • Department 有 ManyToMany(batch) 并且 batch 有 ForeignKey to Department.. 是不是有点麻烦
    • 不。一张表可以关联一张或多张表,对吧?您的部门将有两个外键和一个主键。这不是要担心的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多