Python 何时使用多通和多通关系

Python 何时使用多通和多通关系,python,django-models,many-to-many,relational-database,foreign-key-relationship,Python,Django Models,Many To Many,Relational Database,Foreign Key Relationship,下面是一个大学数据库及其评级。下面是我的想法 每个班级(批次,例如:2009批次)属于一个部门 每个系(例如:药学系)都属于一所学院 因为我特别关注收视率。我想给一批学生打分,通过使用经理或某种模型方法,我可以计算出整个系或学院的评分 每个班级都有等级 注意:对于一个类,可能有许多不同用户的评分。所以,我想总评分或平均评分应该通过一种方法来完成 到目前为止,我就是这样做的 class Rating(models.Model): positive = models.FloatField(d

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

  • 每个班级(批次,例如:2009批次)属于一个部门
  • 每个系(例如:药学系)都属于一所学院
  • 因为我特别关注收视率。我想给一批学生打分,通过使用经理或某种模型方法,我可以计算出整个系或学院的评分

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

    到目前为止,我就是这样做的

    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)
    
    这会是正确的吗?如果不是,它应该是什么样子

    谢谢

    这里是:

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

    这就是我在回答(下面)中提到的。。是吗?部门有很多(批),批有部门的外键。。这是不是会让人不安。一个表可以与一个或多个表相关,对吗?您的部门将有两个外键和一个主键。这不是需要担心的事。