【问题标题】:Django: Most efficient way to link two elements in different tablesDjango:链接不同表中的两个元素的最有效方法
【发布时间】:2012-07-23 10:15:06
【问题描述】:

我在 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

总结/解释每个用户“都有”作品。每部作品“都有”章节。每个章节“都有”一个评论和每个评论。还有其他事情,但我的问题也无关紧要。现在,每件“拥有”的东西都有一个“所有者”的外键。所以评论有一个章节的外键,章节有一个作品的外键等等。我的问题是,有什么更好的方法来做到这一点?现在,服务器必须查看所有评论才能找到哪些属于作品。有没有办法加快/改进查找过程?

编辑:我通常需要按照以下方向访问数据用户 -> 工作 -> 章节 -> 审查。这意味着服务器知道用户是什么,并被要求查找用户所做的所有工作。这与了解工作并找到用户相比。

【问题讨论】:

  • 从您的问题中不清楚您要查找的具体内容。您想要与特定所有者相关的所有评论的列表吗?或者你想找到链顶端的作者进行评论?还是……?

标签: python database django django-models performance


【解决方案1】:

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

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

此外,您不需要在 Review 类中使用多余的工作字段,因为 Review 键是 Chapter 和 Chapter 键是 Work。即,您可以通过章节轻松地从 Review 开始工作 - 无需两种方式即可到达那里。

请参阅QuerySet API 文档了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2016-02-11
    • 2021-07-10
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多