【问题标题】:extract or return only the model instance of a foreign key or one to one field from a queryset in django从 django 的查询集中仅提取或返回外键或一对一字段的模型实例
【发布时间】:2011-09-13 21:12:27
【问题描述】:

有谁知道是否可以从 Django 的查询集中仅提取外键或一对一字段的模型实例?

假设我有两个类,一个 Post 和一个 MagicalPost,由 OneToOne 字段链接,如下所示:

class Post(models.Model):
    ...


class MagicalPost(models.Model):
    post = models.OneToOneField('Post')
    pony = models.TextField(max_length=100, help_text='This is where the MAGIC happens!')

我想对所有神奇的帖子进行查询,但我只想接收帖子对象。现在我正在遍历查询集以提取帖子:

magical_posts = MagicalPost.objects.all()
posts = []

for magical_post in magical_posts:
    posts.append(magical_post.post)

return posts

更进一步,帖子由对一般 Post 对象进行操作的函数处理,因此我不想处理 magic_post.post 外推,也不需要魔法属性。

这并不“感觉”正确。我认为可能有更好的方法来提取外键,所以如果有人知道更好/更清洁的方法来做到这一点,我会全力以赴;否则我会保持这样的状态,因为 . . .出色地 。 . .它有效!

谢谢。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    例如,您可以轻松地使用select_related。这将只是一个数据库查询。

    magical_posts = MagicalPost.objects.select_related()
    # same code
    

    或者使用 2 个这样的查询:

    posts_ids = MagicalPost.objects.values_list('post', flat=True)
    posts = Post.objects.filter(id__in=posts_ids)
    

    【讨论】:

    • 谢谢,这是两个不错的选择。我喜欢这个实例中的 select_related,因为它只创建一个数据库查询。我在字段中添加了一个选定的属性,因为在我的情况下,我有其他东西外键到主对象。 MagicalPost.objects.select_related('post')我也喜欢你的第二个选项,因为它比循环更干净。
    • 顺便说一句,您还可以搜索Post 对象,通过MagicalPost attrs 过滤它们。像这样:Post.objects.filter(magicalpost__attr=value)。它将自动使用 JOIN,就像使用 select_related
    猜你喜欢
    • 2016-03-13
    • 2016-12-18
    • 2020-08-14
    • 2017-04-22
    • 1970-01-01
    • 2022-11-24
    • 2011-06-15
    • 2022-11-22
    相关资源
    最近更新 更多