Django:链接不同表中两个元素的最有效方法

时间:2012-07-25 02:45:38

标签: python database django django-models performance

我在Django中有以下模型:

from django.db import models

class User(models.Model):
    pen_name = models.CharField(max_length=30)
    email = models.EmailField()
    activated = models.BooleanField()
    def __unicode__(self):
        return self.email + '-' + self.pen_name

class Original_Work(models.Model):
    title = models.CharField(max_length=25)
    summery = models.TextField()
    user = models.ForeignKey(User)
    date_published = models.DateField()
    one_shot = models.BooleanField()
    def __unicode__(self):
        return self.title + '-' + self.user.email

class Chapter(models.Model):
    work = models.ForeignKey(Work)
    title = models.CharField(max_length=25)
    order_number = models.IntegerField()

class Review(models.Model):
    chapter = models.ForeignKey(Chapter)
    work = models.ForeignKey(Work)
    date_published = models.DateField()

class Work_Subscription(models.Model):
    user = models.ForeignKey(User)
    to_work = models.ForeignKey(Work)

class User_Subscription(models.Model):
    user = models.ForeignKey(User, related_name='user_owner')
    to_user = models.ForeignKey(User, related_name='user_to')

class Alert(models.Model):
    title = models.CharField(max_length=60)
    # add type
    link = models.CharField()


class Book(models.Model):
    title = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    def __unicode__(self):
        return self.title

在夏季/解释中,每个用户“有”作品。每部作品都有“章节”。每章都有“评论”和每篇评论。还有其他一些事情,但那些问题也无关紧要。现在,每个“拥有”的东西都有一个外键给它的“所有者”。因此,评论具有章节的外键,章节具有作品的外键等。我的问题是,有什么更好的方法呢?现在,服务器必须查看所有评论才能找到属于作品的评论。是否有某种方法可以加快/改善查找过程?

编辑:我通常需要按以下方向访问数据用户 - >工作 - >章 - >评论。这意味着服务器知道用户并被要求查找用户已完成的所有工作。这与了解工作和找到用户有关。

1 个答案:

答案 0 :(得分:0)

我假设您打算将您的OriginalWork课程称为“工作”。我还假设我们正在为网站的当前访问者执行查询。这应该可以解决问题:

author = request.user
Review.objects.filter(chapter__work__user=author)

此外,您不需要Review类上的冗余工作字段,因为查看章节和章节键的工作密钥。也就是说,你可以通过章节轻松地从评论中获得工作 - 不需要有两种方法来实现目标。

有关详情,请参阅QuerySet API文档。