gpt4 book ai didi

python - Django select_related() 和 GenericForeignKey

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:20 25 4
gpt4 key购买 nike

我有这样的模型:

class Comment(models.Model):
text = models.TextField(max_length = 250, blank = False)
author = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')

class Product(models.Model):
name = models.CharField(max_length = 40)
comments = generic.GenericRelation(Comment)

在此模板中,我显示了所有产品的最新 5 条评论:

<ul>
{% for comment in last_comments %}
<li><a href="/user/{{ comment.author }}/">{{ comment.author }}</a> on <a href="/product/{{ comment.content_object.name }}/">{{ comment.content_object }}</a>
<br>{{ comment.text }}</li>
{% endfor %}
</ul>

如果我得到 last_commentslast_comments = Comment.objects.all().order_by('-id')[:5] django 调试工具栏说执行了 25查询。

如果我得到 last_commentslast_comments = Comment.objects.select_related().all().order_by('-id')[:5] django 调试工具栏说执行了 20 个查询。

但是为什么 select_related 没有选择相关的 content_object 呢?在 Django 调试工具栏中,我看到 5 个获取产品的查询。并且肯定是 {{ comment.content_object }}

的结果

可能是因为我在Comment模型中使用了GenericForeignKey

你有什么想法吗?

最佳答案

您可以尝试重构您的数据库,使其看起来有点像这样:

class Comment(models.Model):
...
content_object = models.ForeignKey(Content)

class Content(models.Model):
text = models.CharField(max_length=123)

class SomeSpecificContent(models.Model):
...
content = models.ForeignKey(Content)

class OtherSpecificContent(models.Model):
...
content = models.ForeignKey(Content)

在 Django 的情况下,这实际上与以下模式非常相似:

class Comment(models.Model):
...
content_object = models.ForeignKey(Content)

class Content(models.Model):
text = models.TextField()

class SomeSpecificContent(Content):
...

class OtherSpecificContent(Content):
...

因为这基本上就是 Django 中处理继承的方式。后者可能不太灵活,并且在 SomeSpecificContent 和 OtherSpecificContent 实际上代表完全不同的概念的情况下可能有点难以理解。

另一方面,通用关系无法准确地有效处理,因为它们可以链接到您希望它们链接到的任何表。因此,如果您有 5 个对象的列表,则可能会发生,每个对象都与不同类型的实体相关。不确定 Django 如何处理 100 个对象与 5 种类型的实体相关的情况。它实际上会生成 5+1 个查询吗?

关于python - Django select_related() 和 GenericForeignKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com