何时使用ManyToOne和ManyToMany关系

时间:2013-04-30 03:58:26

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

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

  1. 每个班级(批次,例如:2009年批次)属于部门
  2. 每个部门(例如:药房部门)属于学院
  3. 因为我特别关注评级。我想通过使用管理器或某种模型方法评估批次,我可以计算总部门或大学评级。

    1. 每个班级都有评分
    2. 注意:单个班级的不同用户可能会有很多评分。所以,我猜全部或平均评分应该通过方法完成!

      这就是我到目前为止的方式

      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年可能有很多部门),每个部门都可以在很多学院

        < / LI>

      那么,我应该使用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)
      

      这会是对的吗?如果不是

      ,应该怎么看?

      由于

1 个答案:

答案 0 :(得分:0)

这就是:

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会自动创建一个桥实体。