构建Django多对多关系

时间:2010-10-20 20:58:07

标签: python django django-models

在为我的学校年鉴委员会撰写申请时,我通过对特定关系进行建模而遇到了一些死胡同。目前我有一个照片类

class Photo(models.Model):
 photo = models.ImageField(upload_to="user_photos/")
 name = models.CharField(blank=True, max_length=50)

 rating = models.IntegerField(default=1000)

 wins = models.IntegerField(default=0)
 matches = models.IntegerField(default=0)

和用户类

class UserProfile(models.Model):
 user = models.ForeignKey(User, unique=True)
 group = models.CharField(max_length=50)

这两个都在游泳。我想要做的是将其分解,以便照片具有来自整个用户群的投票的全球评级以及仅基于用户对该照片的投票的评级。不幸的是,我对如何构建这个问题感到茫然。我的第一个想法是一个ManyToMany字段,但我也在考虑将评级分类为自己的模型,如下所示:

class Rating(models.Model)
     photo = models.ManyToOne(Photo)
     rating = models.IntegerField(default=1500)

可行。

一个Django(或者真的,那些有点能干的人,因为我知道我不是)大师能指出我正确的方向来解决这个简单的难题吗?

4 个答案:

答案 0 :(得分:2)

您需要through table

答案 1 :(得分:1)

您希望拥有多对多字段,但需要自定义。

class Rating(models.Model):
    photo = models.ForeignKey(Photo)
    user = models.ForeignKey(User)
    rating = models.IntegerField(default=1500)

class Photo(models.Model):
    photo = models.ImageField(upload_to="user_photos/")
    name = models.CharField(blank=True, max_length=50)

    rating = models.ManyToManyField(User, through='Rating')

    wins = models.IntegerField(default=0)
    matches = models.IntegerField(default=0)
然后,您可以查询它是否有照片对象或用户对象。

这种方法很幼稚,不会很好地扩展。在一个非常受欢迎的网站上,评级模型会因请求而过载。更专业的网站会做什么,通过引入冗余整数字段(例如rating_total)来设置依赖关系,并设置一个cron作业来定期更新它,这样您就不需要通过多对多关系构建查询,但是马上从一个领域得到结果。

答案 2 :(得分:0)

我并不完全理解您的问题,但是为了在django中代表多对一关系,您使用ForeignKey-field!但正如Ignacio已经指出与中间模型的多对多关系可能对你有用!

答案 3 :(得分:0)

我不太明白这句话:“照片的全球评级来自整个用户群的投票,以及仅根据用户对该照片投票的评分。”

但是,如果您的意思是要创建一个字段评级,以便您拥有所有用户的总和,并保存另一个包含用户照片的费率;你应该首先考虑是否值得,因为对于计算字段,你可以选择在数据库中物理存储(全局速率)这些值或根据需要计算它们。您应该根据计算值的频率以及计算它需要多少信息来做出决定。

请注意,存储计算值意味着每次更改用户速率时都会计算它。