0

有人可以通过以下示例给我最好的方法...

在一个页面上,我按 ID 加载“”对象。我还想列出属于该组的所有联系人(带有分页)。

由于分页问题,​​我正在考虑只运行第二个数据库查询......

在我看来...

group = get_object_or_404(Group, pk=id)
contacts = Contacts.objects.filter(group=x) 

但这似乎很浪费,因为我已经知道 Group 为什么要两次访问数据库。

看我的模型。

class GroupManager(models.Manager):

    def for_user(self, user):
        return self.get_query_set().filter(user=user,)


class Group(models.Model):
    name = models.CharField(max_length=60)
    modified = models.DateTimeField(null=True, auto_now=True,)

    #FK
    user = models.ForeignKey(User, related_name="user")

    objects = GroupManager()


    def get_absolute_url(self):
        return reverse('contacts.views.group', args=[str(self.id)])


class Contact(models.Model):

    first_name = models.CharField(max_length=60)
    last_name = models.CharField(max_length=60)

    #FK
    group = models.ForeignKey(Group)
4

1 回答 1

1

这是select_related为:

返回一个 QuerySet,它将自动“遵循”外键关系,在执行查询时选择附加的相关对象数据。这是一个性能提升器,它会导致(有时很多)更大的查询,但意味着以后使用外键关系将不需要数据库查询。

在您的情况下,它将是:

Group.objects.select_related().get(pk=group) 

现在在每次 FK 查找时,您不会再次访问数据库。

下一步是使用缓存 api缓存结果,这样您就不会在每次调用下一个“页面”时都访问数据库。如果您的数据对时间不敏感,这将很有用。

于 2013-03-17T10:58:45.590 回答